2014-09-11 8 views
0

Я работаю над проектом, который включает в себя работу с кодированием шейдеров, с которым я не знаком. Мне предоставили некоторый код HLSL у другого члена команды и пытались реализовать в единстве. Не имея возможности использовать предоставленный код напрямую, я пытаюсь преобразовать его в формат, в котором единство хочет, чтобы оно было как показано ниже. Просто хотел посмотреть, нет ли явного я ошибаюсь, он компилируется отлично, и я могу прикрепить его к объекту, но его просто плоский черный.проблемы с преобразованием шейдера HLSL в shaderLab

Shader "Custom/test2" { 
SubShader { 
    Pass{ 
    CGPROGRAM 
    #pragma fragment frag 

    struct PixelInput { 
     float4 norm : TEXCOORD0; 
     float4 worldpos : TEXCOORD1; 
     float4 eyevector : TEXCOORD2; 
     float4 tangent : TEXCOORD3; 
     float4 binormal : TEXCOORD4; 
     float4 objpos : TEXCOORD5; 
     float4 tex0 : TEXCOORD6; 
     float4 tex1 : TEXCOORD7; 
    }; 

    struct PixelOutput { 
     float4 c : COLOR; 
    }; 

    uniform sampler2D BumpTex; 
    uniform sampler2D MarbleCol1; 

    float4 marblefunc(float4 p, float3 norm, float3 eye, float4 uv){ 
     float3 var; 
     float3 pos = p.xyz * 0.019500 ; 
     float3 r = float3(pos.x, pos.y, pos.z); 
     var[0] = (pos.x +10000)* 0.045000 + 60 *noise (r); 
     var[2] = var[0]%17; 
     if (var[2]<4){ 
      r.r = pos.x/70.0f; r.g = pos.y/50.0f; r.b = pos.z/50.0f; 
      var[1] = 0.7f+0.2f*noise(r); 
     } 
     else { 
      r.r = pos.x; r.g = pos.y; r.b = pos.z; 
      if (var[2] <9) { 
       if (var[2] >=12){ 
        var[0] = abs(var[0]-(var[0]/17.0) *17.0 - 10.5)* 0.1538462; 
        var[1] = 0.3 + 0.3*var[0] + 0.8*noise(r); 

       } 
      } else { 
       var[1] = 0.3f*(1.0f + noise(r)); 
      } 
     } 
     float4 c0 = tex2D(MarbleCol1,uv); 
     float4 c1 = float4(0.301961, 0.815686, 0.101961, 1.0); 
     return (1.0f-var[1])*c0 + var[1]*c1; 
    } 

    uniform float4 Specular = float4(0.900000,0.900000,0.900000,1.000000); 
    uniform float4 Emissive = float4(0.000000,0.000000,0.000000,1.0f); 
    uniform float SpecularLevel = 0.000000; 
    uniform float GlossLevel = 9.999999; 
    uniform float3 LightCol0; 
    uniform float3 LightDir0; 
    uniform float LightFallOff0; 
    uniform float LightHotSpot0; 
    uniform float Opacity = 1.000000; 

    PixelOutput fragmentEntry(PixelInput pi) 
    { 
     PixelOutput PO; 
     float3 N; 
     N = normalize(pi.norm.xyz); 
     float3 Eye; 
     Eye.xyz = normalize(pi.eyevector.xyz); 
     float4 nColor = float4(0.0,0.0,0.0,1.0); 
     float3 BumpN; 
     float3 BumpX, BumpY, BumpZ; 
     BumpN = tex2D(BumpTex, pi.tex0); 
     BumpN = (BumpN - 0.5); 
     BumpN = normalize(float3(BumpN.x *0.300000, BumpN.y *0.300000, BumpN.z)); 
     BumpZ = N; 
     BumpX = pi.binormal.xyz; 
     BumpY = pi.tangent.xyz; 
     BumpX = normalize(BumpX); 
     BumpY = normalize(BumpY); 
     BumpZ = normalize(BumpZ); 
     N = BumpX *BumpN.x + BumpY* BumpN.y + BumpZ *BumpN.z; 
     float4 mDiffuse; 
     mDiffuse = marblefunc(pi.objpos, N, Eye, pi.tex0); 
     float4 mSpecular = Specular; 
     float4 SelfIllum = Emissive; 
     nColor = nColor + SelfIllum *mDiffuse; 
     float3 H; 
     float3 Light; 
     float f; 
     float fAtt; 
     float fDist; 
     fAtt = 1.0; 
     nColor = nColor + float4(LightCol0,1.0)* mDiffuse* clamp(dot(N,LightDir0),0,1)* fAtt; 
     H = normalize(Eye+Light); 
     f = clamp(dot(N,H),0,1); 
     f = pow(f, GlossLevel); 
     f = f *SpecularLevel; 
     nColor = nColor + float4(LightCol0,1.0)* mSpecular* f *fAtt; 
     nColor.a = Opacity; 
     PO.c = nColor; 
     return PO; 
    } 
    ENDCG 
    } 
} 
FallBack "Diffuse" 
} 

Любая помощь очень ценится.

ответ

1

Вы действительно должны попытаться скомпилировать его и решить проблему с компилятором шаг за шагом. Вот лишь несколько советов:

  1. Вы используете обычный CG код, не shaderlab шейдеров. Это прекрасно, и синтаксис тот же, что и в документе Nvidia.
  2. var[2] = var[0]%17; var - это поплавок, поэтому вместо этого вы должны использовать fmod.
  3. Когда вы пишете шейдеры в простой CG, вы должны предоставить как фрагмент, так и программы вершин. В вашем случае отсутствует вершинная программа. (см. #pragma vertex vertexFunctionName)
  4. После быстрого теста вы, вероятно, используете слишком много инструкций. Вы должны рассмотреть возможность компиляции с более высоким профилем (например, #pragma target 3.0).

Вверху есть несколько советов. Я думаю, что будет слишком много отлаживать шейдер для вас. Если у вас есть конкретные вопросы по конкретным ошибкам, не стесняйтесь спрашивать.

+0

ОК спасибо за советы. У меня был вершинный вершин вершины #pragma, но он вынул его, поскольку он выдавал ошибку, чтобы я мог довести ее до состояния, в котором она выполнялась. когда вы упоминаете использование цели 3.0, это то, что поверх или вместо pragma frag и pragma vert. другой, то время, чтобы прочитать на nvidia doc, чтобы получить более комфортное со всем этим :) –

+0

@David Parsonson: чтобы быть более понятным. target 3.0 является единственной специфической директивой: http://docs.unity3d.com/Manual/SL-ShaderPrograms.html – Heisenbug

Смежные вопросы