这里指的是Unity里面的cg shader。
昨天尝试在shader里面加入了光照,结果光照显示不出来。
在vertex shader的传出参数里面加入光照颜色值:
//2014-07-02, try light
float4 lightcol;
在vertex shader里面加入计算漫反射光照代码:
//2014-07-02, try light
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
float3 normalDirection = normalize(float3(mul(float4(v.normal, 0.0), modelMatrixInverse)));
float3 lightDirection;
if (0.0 == _WorldSpaceLightPos0.w)
{
lightDirection = normalize(float3(_WorldSpaceLightPos0));
}
else
{
float3 vertexToLightSource = float3(_WorldSpaceLightPos0 - mul(modelMatrix, v.vertex));
lightDirection = normalize(vertexToLightSource);
}
o.lightcol = float4(float3(_LightColor0) * max(0.0, dot(lightDirection, lightDirection)), 1.0);//fixed4(1,1,1,1);//
//-try light
fragment shader里面修改返回最终颜色
//2014-07-02, try light
fixed4 color = i.lightcol * tex2D(_MainTex, i.uv);
可是光照显示不出。最终颜色全黑。
把纹理颜色去掉,显示出的是莫名其妙的插值颜色:
//2014-07-02, try light
fixed4 color = i.lightcol;// * tex2D(_MainTex, i.uv);
这时候就算直接在vertex里面让返回的光照颜色为float4(1,1,1,1)或float4(0,0,0,1),结果都如上所示。
我把vertex shader里面获取uv坐标的代码注释后,
// o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
结果光照颜色是对的:
在Unity中调整光照强度可以改变球体的颜色。说明光照被应用上了。uv值的获取代码似乎影响了光照颜色值。这很奇怪。可是注释uv值的获取就不能应用纹理贴图了啊,这样还是不行。然后我发现在vertex shader的返回值中的这个我添加的光照颜色,没有添加语义(SEMANTIC),赶紧加上COLOR SEMANTIC:
float4 lightcol:COLOR;
vertex shader中uv值的获取恢复:
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
fragment shader中计算颜色的代码恢复为:
fixed4 color = i.lightcol * tex2D(_MainTex, i.uv);
最终光照正常显示,有纹理。可以应对光照相应调整。
没有SEMANTIC的时候lightcol被uv值的获取影响到是挺奇怪的。由此可见SEMANTIC的重要性!