阅读背景:

3.Unity_CG_Shader光照之——漫反射(lambert模型以及Half lambert模型)

来源:互联网 

兰伯特光照模型:

逐顶点漫反射  

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Ycb/04_diffuse" {
	Properties{
		_Diffuse("Diffuse_Color",Color)=(1,1,1,1)
	}
	SubShader{
		Pass{
			CGPROGRAM
			//顶点函数  从顶点坐标-》裁剪窗口(游戏环境->摄像机)
			#pragma vertex vert
			//片元函数  返回模型上对应屏幕上的像素的颜色
			#pragma fragment frag
#include "Lighting.cginc"//取到第一个直射光的颜色 _LightColor0    _WorldSpaceLightPos0第一个直射光的位置
			fixed4 _Diffuse;
			//application to vertex
			struct a2v {
				float4 vertex:POSITION; 
				float3 normal:NORMAL;
			};
			//vertex to fragment
			struct v2f{ 
				float4 position : SV_POSITION;
				fixed3 color:Color;
			};

			v2f vert(a2v v) {
				v2f f;
				f.position = mul(UNITY_MATRIX_MVP,v.vertex);  //UNTIY_MATRIX_MVP 把一个顶点的矩阵从模型空间到剪裁空间

				fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.rgb;
				//为了下面的夹角cos计算,统一到一个坐标系中,这里将法线方向从模型坐标系转化到世界坐标系中,因此下面试v * w2o
				fixed3 normalDir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));//unity_WorldToObject从世界空间转化到模型空间

				fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz);//光源的位置就是光的方向

				fixed3 diffuse=_LightColor0.rgb*max(0,dot(normalDir,lightDir));		//漫反射计算公式= 光照颜色*cos(法线*光照方向)		
				diffuse*=_Diffuse.rgb; //与原有的颜色融合,直接相乘
				f.color=diffuse;
				f.color+=ambient;//叠加直接相加
				return f;
			}
			fixed4 frag(v2f f):SV_Target{
				return fixed4(f.color,1);
			}
			ENDCG
		}
	}
 
	
	Fallback "VertexLit"

}// Upgrade NOTE: repla



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: