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

Posted victor2k

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 记录 Unity Shader 碰到的一个奇怪bug记录。相关的知识,希望对你有一定的参考价值。

                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));
 
这个问题先搁置一下,以后再探索,如果有大佬知道原因,希望不吝探讨和赐教一下。

以上是关于Unity 记录 Unity Shader 碰到的一个奇怪bug记录。的主要内容,如果未能解决你的问题,请参考以下文章

Unity开发bug记录100例子(第1例)——打包后shader失效或者bug

Unity开发bug记录100例子(第1例)——打包后shader失效或者bug

unity shader 人物走入草丛,草的晃动特效特效怎么做

Unity Shader初识Shader,基础总结!

Unity开发bug记录100例子(第1例)——打包后shader失效或者bug

Unity Shader GraphDissolve Effect