Unity 记录 Unity Shader 碰到的一个奇怪bug记录。

不打扰是莪最后的温柔 提交于 2020-08-18 15:35:57
                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));
 
这个问题先搁置一下,以后再探索,如果有大佬知道原因,希望不吝探讨和赐教一下。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!