原谅我,不是很懂这些公式的含义,所以用这个土方法,我想应该有不少人都是这样的,下面的步骤对应是在什么地方做这些动作
1. struct a2v{};(application to view)
2. struct v2f{}
3.v2f vert(a2v v){}
4.fixed4 frag(v2f f){}
一.转换坐标(必有)
1 .float4 vertex:POSITION;
2 .float4 svpos:SV_POSITION;
3 .//将坐标从模型空间转换到剪裁空间
f.svpos = UnityObjectToClipPos(v.vertex);
二.获得法线的直线(必有)
1.float3 normal:NORMAL;
2.float3 worldNormal:TEXCOORD0;
3.f.worldNormal = UnityObjectToWorldNormal(v.normal);
4.//获取法线的直线
fixed3 normalDir = normalize(f.worldNormal);
三.获取平行光的直线
2.float4 worldVertex:TEXCOORD1;
3.//获得世界顶点(用来获取光源的直线)//(获取摄像机的直线也是这个?)
f.worldVertex = mul(v.vertex, unity_WorldToObject);
4.//获取平行光的直线
fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex));
四.获取相机的视野直线
//相机的视野直线
fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex));
五.//平分线的直线
fixed3 halfDir = normalize(lightDir + viewDir);
六.//获取漫反射颜色
fixed3 diffuse = _LightColor0 * _Diffuse.rgb * max(dot(normalDir, lightDir)*0.5+0.5, 0);
七.//获取高光反射的颜色值
fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir,halfDir), 0), _Gloss);
八获取环境光的颜色
UNITY_LIGHTMODEL_AMBIENT.rgb
九.设置纹理
Pro_MainTex("Textur",2D) = "white"{}
sampler2D _MainTex;
float4 _MainTex_ST;
1.float4 texcoord:TEXCOORD0;
2.float2 uv:TEXCOORD2;
3.//取得纹理顶点
f.uv = v.texcoord.xy * _MainTex_ST.xy+_MainTex_ST.zw;
4.//获取漫反射颜色(此处将漫反射的颜色抹去,换成了纹理的颜色)
fixed3 texColor = tex2D(_MainTex,f.uv.xy);
fixed3 diffuse = _LightColor0 * texColor * max(dot(normalDir, lightDir)*0.5+0.5, 0);
10.对物体表面的凹凸性进行处理(只需要改变切线空间的法线)
Pro: _BumpScale("Bump Scale",Float)=1//保持默认的样子
Float _BumpScale;
tangentNormal.xy = tabgentNormal.xy * _BumpScale ; (在单位化之前处理)