2014-08-27 42 views
0

我为每个顶点着色和其他每片段着色都写了两个着色器,这两个着色器都模拟点光漫射照明,两个着色器都在不弹出错误的情况下工作,但渲染的per-frag模型着色器看起来与每个顶点的结果相同,我的意思是顶点之间的per-frag平滑效果看起来与每个顶点线性内插结果相同的百分之百。每个片段着色失败

所以,,,,我的代码出了什么问题,或者我误解了一些东西,是否有任何区别texcoord set 0 1 2 3 4?

每顶点着色器:

Shader "Custom/neo2" { 
Properties { 

    _LightPosX("lightposx",float) = 14 
    _LightPosY("lightposy",float) = 14 
    _LightPosZ("lightposz",float) = 14 

} 
SubShader { 

    Pass{ 

     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 

     float _LightPosX; 
     float _LightPosY; 
     float _LightPosZ; 

     struct tex{ 
      float4 tex0:TEXCOORD0; 
      float4 tex1:TEXCOORD1; 
     }; 

     struct col{ 
      float4 col; 
     }; 


     col vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal){ 
      oPos = mul(UNITY_MATRIX_MVP,pos); 
      col c; 
      float3 normalDir = normalize((mul(_Object2World,float4(normal,0))).xyz); 
      float3 lightDir = normalize(float4(_LightPosX,_LightPosY,_LightPosZ,1) - mul(_Object2World,pos)); 
      c.col = float4(1,1,1,1)*dot(normalDir,lightDir); 
      return c; 

     } 

     float4 frag(col c):COLOR{ 
      return c.col; 
     } 

     ENDCG 






    } 


} 
FallBack "Diffuse" 

}

每个片段着色器:

Shader "Custom/neo3" { 
Properties { 
    _LightPosX("lightposx",float) = 14 
    _LightPosY("lightposy",float) = 14 
    _LightPosZ("lightposz",float) = 14 

} 
SubShader { 

    Pass{ 

     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 

     float _LightPosX; 
     float _LightPosY; 
     float _LightPosZ; 

     struct tex{ 
      float4 tex0:TEXCOORD0; 
      float4 tex1:TEXCOORD1; 
     }; 


     tex vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal){ 
      oPos = mul(UNITY_MATRIX_MVP,pos); 
      tex t; 
      t.tex0 = mul(_Object2World,pos); 
      t.tex1= normalize(mul(_Object2World,float4(normal,0))); 
      return t; 

     } 

     float4 frag(tex t):COLOR{ 
      float3 lightDir = normalize(float3(_LightPosX,_LightPosY,_LightPosZ) - t.tex0); 

      float4 col = float4(1,1,1,1)*dot(t.tex1,lightDir); 
      return col; 




     } 

     ENDCG 






    } 


} 
FallBack "Diffuse" 

}

回答

0

有所述texcoords之间没有差异。

闪电看起来多么依赖于你用来计算的正常值。在这两种情况下,您都会预先计算法线顶点,因此您会对整个三角形使用相同的法线,因此会得到相同的结果。

如果您改为在片段中进行计算,那么每个像素都会得到一个法线,从而得到更平滑的结果。

的每个像素着色器

tex vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal) 
{ 
    oPos = mul(UNITY_MATRIX_MVP,pos); 
    tex t; 
    t.tex0 = mul(_Object2World,pos); 
    t.tex1 = float4(normal,0); 

    return t; 
} 

float4 frag(tex t):COLOR 
{ 
    float3 lightDir = normalize(float3(_LightPosX,_LightPosY,_LightPosZ) - t.tex0); 

    float4 normal = normalize(mul(_Object2World,float4(t.tex1,0))); 
    float4 col = float4(1,1,1,1)*dot(normal, lightDir); 
    return col; 
}