本文共 2034 字,大约阅读时间需要 6 分钟。
Shader "Unlit/VertDiffuse"{ Properties { _MainTex ("Texture", 2D) = "white" {} _Color("Overall diffuse color filter",Color)=(1,1,1,1) } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { Tags{ // 光照模式为Forward,只有向前渲染模式下Unity内置的参数才能正确被赋值 "LightMode"="ForwardBase" } CGPROGRAM // 声明顶点着色器 #pragma vertex vert // 声明片段着色器 #pragma fragment frag #include "UnityCG.cginc" // 因为使用了内置的灯光相关参数,_WorldSpaceLightPos0,_LightColor0等 #include "Lighting.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal:NORMAL; }; struct v2f { float4 col:COLOR; float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _Color; float4 _speColor; float _Shininess; v2f vert (appdata v) { v2f o; // 法线世界单位方向 float3 normalDic = normalize(UnityObjectToWorldNormal(v.normal)); // 世界顶点指向光源,计算方向(注意是顶点指向光源,做反射计算的时候通常会将方向乘上一个负1) float3 v2lightDic = normalize(_WorldSpaceLightPos0); // 漫反射颜色计算(点积来计算一个光强系数0-1之间) float3 diffuseReflection = _LightColor0.rgb * _Color.rgb * saturate(dot(normalDic,v2lightDic)); // 如果物体背光,就是黑色,所以背光的时候,需要+上环境光 o.col = float4(diffuseReflection,1)+UNITY_LIGHTMODEL_AMBIENT; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv) * i.col; return col; } ENDCG } }}