UnityShader初级篇——实现逐像素漫反射光照模型

时间:2022-06-13 04:45:15

1.UnityShader初级篇——实现逐像素漫反射光照模型

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

Shader "Unity Shaders Book/Chapter 6/Diffuse Pixel-Level"
{
	Properties
	{
	     //定义属性,控制材质的漫反射颜色
		_Diffuse ("Diffuse", Color)=(1,1,1,1)
	}
	SubShader
	{
		Pass
		{
		    //指明该Pass的光照模式
		    Tags{"LightMode"="ForwardBase"}
		    
			CGPROGRAM

			//告诉Unity我们定义的定点着色器和片远着色器的名字
			#pragma vertex vert
			#pragma fragment frag

			// 包含引用内置文件		
			#include "Lighting.cginc"

			//引用属性,定义一个与该属性类型相匹配的变量
			fixed4 _Diffuse;

			//定义顶点着色器的输入和输出结构体
			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;//存储模型法线信息
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
			};

			//在顶点着色器中只需将模法线传递给片元着色器
			v2f vert (a2v v)
			{
				v2f o;
				//将顶点坐标从模型坐标转换为裁剪坐标
				o.pos = UnityObjectToClipPos(v.vertex);
				//将模型法线转换到世界坐标,并传递给片元着色器
				o.worldNormal = mul(v.normal,(float3x3)_World2Object);
				return o;
			}

			//在片元着色器中计算漫反射光照模型
			fixed4 frag (v2f i) : SV_Target
			{
			       //获取环境光
			       fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
			       //获取世界空间下的法线并归一化
			       fixed3 worldNormal = normalize(i.worldNormal);
			       //获取世界空间下的光照方向
			       fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
			       //计算漫反射光照模型
			       fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));

			       fixed3 color = ambient + diffuse;
			       return fixed4(color,1.0);
			}
			ENDCG
		}
	}
	Fallback "Diffuse"
}

UnityShader初级篇——实现逐像素漫反射光照模型

UnityShader初级篇——实现逐像素漫反射光照模型

逐像素漫反射光照比逐顶点漫反射光照的效果更加平滑。