cg shader 光照未显示 - 记录

这里指的是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的重要性!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值