v2f vert(a2v v){
//return UnityObjectToClipPos(v);
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
//return UnityObjectToClipPos(v.vertex);
//f.temp = v.normal;
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//UNITY_LIGHTMODEL_AMBIENT 环境光?
fixed3 normalDir = normalize( mul(v.normal,(float3x3)unity_WorldToObject));
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//对于每一个顶点来说,光的位置就是光的方向,因为光是平行光
fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0)*_Diffuse.rgb;//取得漫反射的颜色
//高光
fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(v.vertex, unity_WorldToObject).xyz);//相机单位化的向量
fixed3 specular = _LightColor0.rgb * pow( max( 0 , dot(reflectDir,viewDir) ),10);
//fixed3 specular = _LightColor0.rgb * pow( max( 0 , 1),10);
f.color = diffuse + ambient + specular;
//f.color = diffuse + ambient;
return f;
}
fixed4 frag(v2f f) : SV_Target {
//return fixed4(0.5,0.9,1,1);
//return fixed4(f.temp,1);
return fixed4(f.color,1);
}
这是高光反射的入门代码
fixed3 specular = _LightColor0.rgb * pow( max( 0 , dot(reflectDir,viewDir) ),10);
这段代码按道理有max ,视角与反射光夹角为钝角的时候,值取0,那背面就不应该存在高光,但是这事情还是发生了
用的Unity版本
那就可能是反射光发生了问题
fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));
光线入射方向取反 然后计算reflect 在背光面(不知道示例为什么不会出现第二个高光)与相机的夹角是有可能成为锐角的,但是示例shader却没有出现背光面高光,高光也能因视角的移动而变化。
猜测:
1.可能是获取相机的视角有问题
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - f.worldVertex);//相机单位化的向量
2.获取的光线有问题
fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));
这个问题先搁置一下,以后再探索,如果有大佬知道原因,希望不吝探讨和赐教一下。
来源:oschina
链接:https://my.oschina.net/u/4373992/blog/4397376