UnityShader 的UnityWorldSpaceLightDir()和_WorldSpaceLightPos0获得的光照方向与实际方向相反

如标题

UnityShader 的UnityWorldSpaceLightDir()和_WorldSpaceLightPos0获得的光照方向与实际方向相反_第1张图片

由图可看出,有一个的光照效果是反的。
另一个正常的是在切线空间进行的计算,用的ObjSpaceLightDir()来获得的模型空间的光照方向然后转换到切线空间,这个是正常的。

对UnityWorldSpaceLightDir()和_WorldSpaceLightPos0取得的光照方向进行取反,就正常了。不知道是什么原因。希望有大牛来解惑一下。

下面贴一下代码

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Test/SingleTextureShader" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Main Tex", 2D) = "white" {}
		_Specular("Specular",Color) = (1,1,1,1)
		_Gloss("Gloss",Range(8.0, 256)) = 20
	}
		SubShader{
			Pass{
				Tags{"LightModel" = "ForwardBase"}

				CGPROGRAM
	#pragma vertex vert
	#pragma fragment frag
	#include "Lighting.cginc"

		fixed4 _Color;
		sampler2D _MainTex;
		float4 _MainTex_ST;
		fixed4 _Specular;
		float _Gloss;

		struct a2v {
			float4 vertex:POSITION;
			float3 normal:NORMAL;
			float4 texcoord:TEXCOORD0;
		};
		struct v2f {
			float4 pos:SV_POSITION;
			float3 worldNormal:TEXCOORD0;
			float3 worldPos:TEXCOORD1;
			float2 uv:TEXCOORD2;
		};


		v2f vert(a2v v) {
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex); 
			o.worldNormal = UnityObjectToWorldNormal(v.normal);
			o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
			o.uv =  v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
			return o;
		}

		fixed4 frag(v2f i) :SV_Target{
			fixed3 worldNormal = normalize(i.worldNormal);
		//fixed3 worldLightDir = -normalize(UnityWorldSpaceLightDir(i.worldPos));
		fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
		fixed3 albedo = tex2D(_MainTex, i.uv).rgb*_Color.rgb;

		fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
		fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

		fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
		fixed3 halfDir = normalize(worldLightDir+viewDir);
		fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);

		return fixed4(ambient+diffuse+specular,1.0);
		}



			ENDCG



}
	}
	FallBack "Specular"
}

你可能感兴趣的:(unityShader)