Shader-漫反射与高光反射综合(详细版)

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "LXC/10 Diffuse Specular"{
	Properties{
		_Diffuse("Diffuse Color",Color) = (1,1,1,1)		//漫反射
		_Specular("Specular Color",Color) = (1,1,1,1)	//高光反射
		_Gloss("Gloss",Range(10,200)) = 20				//高光系数
	}
		SubShader{
			Pass{
				Tags{"LightMode" = "ForwardBase"}		//正确的Tags才能取到光的属性,LightMode还有其他选项
				CGPROGRAM
#include "Lighting.cginc"								//跟光有关的属性在这个文件里
#pragma vertex vert										//顶点函数
#pragma fragment frag									//片元函数

				fixed4 _Diffuse;
				fixed4 _Specular;
				half _Gloss;


				struct a2v {							//给顶点函数传递的结构体
//1	  取得顶点位置
					float4 vertex:POSITION;
//5.2 取得发线
					float3 normal:NORMAL;
				};

				struct v2f {							//顶点函数跟片元函数传递的结构体
//2   剪裁空间下的顶点位置
					float4 svPos:SV_POSITION;
//5.1 传递世界空间下的法线 	TEXCOORD0纹理坐标
					float3 worldNormal:TEXCOORD0;
//6.2 世界空间下的顶点坐标
					float4 worldVertex:TEXCOORD1;
				};





				v2f vert(a2v v) {						//顶点函数,返回值v2f,参数a2v
					v2f f;

//3   顶点位置的矩阵转换,模型空间转换到剪裁空间					
					f.svPos = UnityObjectToClipPos(v.vertex);
//5.3 模型空间到世界空间的发线转换
					f.worldNormal = UnityObjectToWorldNormal(v.normal);
//6.3 把顶点坐标从模型空间转到世界空间	mul(v.vextex, _World2Object 矩阵);
					f.worldVertex = mul(v.vertex, unity_WorldToObject);
					return f;
				}





				fixed4 frag(v2f f):SV_Target {			//片元函数,返回值颜色fixed4,参数v2f,颜色要输出的屏幕上需要定义:SV_Target
//5.4 单位化发线值
					fixed3 normalDir = normalize(f.worldNormal);
//6.1 光的方向 需要传递世界空间下的顶点坐标6.3		1.自己计算。2.内置方法。
					fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex));
//4   漫反射的颜色 _LightColor0 取得平行光的颜色 _Diffuse漫反射的颜色 dot需要一个cos值光的方向6.1和法线5.4的夹角
					fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*max(dot(normalDir, lightDir), 0);




//9   相机方向	需要传递顶点坐标6.3
					fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex));
//8   平分线	需要光6.1和相机的方向9
					fixed3 halfDir = normalize(lightDir + viewDir);
//7   高光反射的颜色	dot(normalDir, halfDir)是cos值:法线5.4和平分线的值8 dot用来取得两个向量的点积(余弦值)
					fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir, halfDir), 0), _Gloss);
//10  光的综合运用	UNITY_LIGHTMODEL_AMBIENT环境光
					fixed3 tempColor = diffuse + specular + UNITY_LIGHTMODEL_AMBIENT.rgb;
//11  颜色返回
					return fixed4(tempColor, 1);
				}
				ENDCG
		}
	}
	Fallback "Specular"
}

猜你喜欢

转载自blog.csdn.net/qq_42459006/article/details/84112645