//获取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
}
Shader之学习笔记九
猜你喜欢
转载自blog.csdn.net/Rose_Girls/article/details/56495734
今日推荐
周排行