Shader之学习笔记九

//获取Unity引擎源代码:加群580392083
//使用单张纹理来作为模拟颜色
Shader "Unity Shaders Book/Chapter 7/Single Texture" {
	Properties{
		_Color("Color Tint",Color) = (1,1,1,1)
		_MainTex("Main Tex",2D) = "white"{}		//2D:纹理熟悉的声明方式 "white":内置纹理的名字 也就是一个全白的纹理
		_Specular("Specular",Color) = (1,1,1,1)
		_Gloss("Gloss",Range(8.0,256)) = 20
	}

	SubShader{
		Pass{
			Tags{"LightMode"="ForwardBase"}	//永不定义该pass在unity的光照流水线中的角色		

			CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#include "Lighting.cginc"	//为了使用Unity内置变量 如:_LightColor0()
				
				//需要声明和上述属性类型相匹配的变量  以便和材质面板中的属性建立联系
				fixed4 _Color;
				sampler2D _MainTex;			
				float4 _MainTex_ST;//ST:  S-->scale  t-->Translation;纹理名_ST;可以得到该纹理缩放和平移的值 _MainTex_ST.xy:存储的是缩放值;_MainTex_ST.zw:存储的是偏移值
				fixed4 _Specular;
				float _Gloss;
				

				//定义顶点着色器的输入
				struct a2v{
					float4 vertext: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 = mul(UNITY_MATRIX_MVP,v.vertext);
					o.worldNormal = UnityObjectToWorldNormal(v.normal); //将模型顶点的法线从模型空间转换到世界空间
					o.worldPos = mul(_Object2World,v.vertext).xyz;//_Object2World:当前的模型矩阵 用于将顶点/方向矢量从模型空间转换到世界空间	
					o.uv =v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;//使用纹理属性对顶点纹理坐标进行变换  得到最终的纹理坐标
					return o;
				}

				//片元着色器
				fixed4 frag(v2f i):SV_Target{
					fixed3 worldNormal = normalize(i.worldNormal);//获取模型在世界空间下的归一化之后的法线方向
					//UnityWorldSpaceLightDir:输入一个世界空间中顶点的位置 返回世界空间中从该点到光源的光照方向
				    fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos)); //计算光照方向
					fixed3 albedo = tex2D(_MainTex,i.uv).rgb*_Color.rgb;//tex2D:对纹理进行采样 第一次参数:需要被采样的纹理;第二个参数:纹理坐标 返回雯素值;得到反射率
					fixed3 ambients = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo;//得到环境光
					fixed3 diffuese = _LightColor0.rgb*albedo*max(0,dot(worldNormal,worldLightDir));//得到漫反射光
					//UnityWorldSpaceViewDir:输入一个世界空间中顶点的位置,返回世界空间中从该点到摄像机的观察方向
					fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));//获取视角方向
					fixed3 halfDir = normalize(worldLightDir + viewDir);//得到反射方向
					fixed3 speculars = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);
					return fixed4(ambients + diffuese + speculars,1.0);

				}				

			ENDCG	
		}
	}
		FallBack "SPECULAR" //设置为内置的SPECULAR

}

发布了70 篇原创文章 · 获赞 68 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Rose_Girls/article/details/56495734