Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
由于着色器Unity3D中的错误,网格上没有阴影_Unity3d_Cg - Fatal编程技术网

由于着色器Unity3D中的错误,网格上没有阴影

由于着色器Unity3D中的错误,网格上没有阴影,unity3d,cg,Unity3d,Cg,我正在写一个香椿水着色器,我希望它由平行光照亮。我让它工作了,但我认为法线有点问题,因为波浪之间没有阴影。我希望有人能发现我犯的错误,并提前向你表示感谢 Shader "Custom/NoobShader_03" { Properties { _Color ("Color", Color) = (1,1,1,1) _Scale ("Wave Scale", float) = 0.6 _Frequency (

我正在写一个香椿水着色器,我希望它由平行光照亮。我让它工作了,但我认为法线有点问题,因为波浪之间没有阴影。我希望有人能发现我犯的错误,并提前向你表示感谢

Shader "Custom/NoobShader_03" {
        Properties {
            _Color ("Color", Color) = (1,1,1,1)

            _Scale ("Wave Scale", float) = 0.6
            _Frequency ("Frequency", float) = 1
            _Speed ("Speed", float) = 0.5

            _Scale2 ("Wave Scale", float) = 0.6
            _Frequency2 ("Frequency", float) = 1
            _Speed2 ("Speed", float) = 1
        }
        SubShader {
            Pass{
            Tags { "LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 _Color;

            float _Scale;
            float _Frequency;
            float _Speed;

            float _Scale2;
            float _Frequency2;
            float _Speed2;

            float4 _LightColor0;

            struct VertexOutput
            {
                float4 pos : SV_POSITION;
                float3 nor : NORMAL;
                float4 col : COLOR;
            };

            struct VertexInput
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct FragmentOutput
            {
                float4 color : COLOR;
            };

            VertexOutput vert (VertexInput i)
            {
                VertexOutput VOUT;
                float randomNum = 1 / _Time;
                float newPos = _Scale * sin(_Time.w * _Speed + i.vertex.x * _Frequency);
                float newPos2 = _Scale2 * cos(_Time.w * _Speed2 + i.vertex.z * _Frequency2);
                //i.vertex.y += newPos;
                float4 tempPos = i.vertex;
                tempPos.y += newPos * newPos2;

                VOUT.pos = mul(UNITY_MATRIX_MVP,tempPos);
                VOUT.nor = float3(mul(UNITY_MATRIX_MVP,tempPos).xyz);

                float3 normalDirection = normalize( mul( float4( VOUT.nor, 0.0 ), _World2Object).xyz);
                float3 lightDirection;
                float atten = 1.0;

                lightDirection = normalize(_WorldSpaceLightPos0.xyz);

                float3 diffuseRefflection = atten * _LightColor0.xyz * _Color.rgb * max( 0.0, dot(normalDirection, lightDirection));

                VOUT.col = float4(diffuseRefflection, 0.0);

                return VOUT;
            }

            FragmentOutput frag(VertexOutput v) 
            {
                FragmentOutput FOUT;
                FOUT.color = v.col + _Color;
                return FOUT;
            }
            ENDCG
            }
        } 
        FallBack "Diffuse"
    }


只是一个关于你正常状态的快速回答

float3 normalDirection = normalize( mul( float4( VOUT.nor, 0.0 ), _World2Object).xyz);              
法线在局部对象空间中给出。您需要转换到世界空间。乘法的顺序是错误的。应该是:

float3 normalDirection = normalize( mul( _World2Object, float4( VOUT.nor, 0.0 )).xyz);
这相当于:

float3 normalDirection = normalize( mul( float4( VOUT.nor, 0.0 ), _Object2World).xyz); 
通常将变换矩阵放在要变换的向量之前