每个片段着色的统一失败

时间:2014-08-27 08:11:48

标签: unity3d shader

我为每个顶点着色编写了两个着色器,另一个用于模拟点光漫射光照的每个片段着色,两个着色器都可以正常工作而不会弹出错误,但是每个碎片着色器的渲染模型似乎具有与每顶点一个相同的结果,我的意思是顶点之间的每个碎片平滑效果看起来与每个顶点线性插值结果的100%相同。

所以,,,,我的代码出了什么问题,或者我误解了什么,texcoord set 0 1 2 3 4之间有什么区别吗?

每顶点着色器:

    Shader "Custom/neo2" {
Properties {

    _LightPosX("lightposx",float) = 14
    _LightPosY("lightposy",float) = 14
    _LightPosZ("lightposz",float) = 14

}
SubShader {

    Pass{

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        float _LightPosX; 
        float _LightPosY;
        float _LightPosZ; 

        struct tex{
            float4 tex0:TEXCOORD0;
            float4 tex1:TEXCOORD1;
        };

        struct col{
            float4 col;
        };


        col vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal){
            oPos = mul(UNITY_MATRIX_MVP,pos);
            col c;
            float3 normalDir = normalize((mul(_Object2World,float4(normal,0))).xyz);
            float3 lightDir = normalize(float4(_LightPosX,_LightPosY,_LightPosZ,1) - mul(_Object2World,pos));
            c.col = float4(1,1,1,1)*dot(normalDir,lightDir);
            return c;

        }

        float4 frag(col c):COLOR{
            return c.col;
        } 

        ENDCG






    }


} 
FallBack "Diffuse"

}

每片段着色器:

    Shader "Custom/neo3" {
Properties {
    _LightPosX("lightposx",float) = 14
    _LightPosY("lightposy",float) = 14
    _LightPosZ("lightposz",float) = 14

}
SubShader {

    Pass{

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        float _LightPosX; 
        float _LightPosY;
        float _LightPosZ; 

        struct tex{
            float4 tex0:TEXCOORD0;
            float4 tex1:TEXCOORD1;
        };


        tex vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal){
            oPos = mul(UNITY_MATRIX_MVP,pos);
            tex t;
            t.tex0 = mul(_Object2World,pos);
            t.tex1= normalize(mul(_Object2World,float4(normal,0)));
            return t;

        }

        float4 frag(tex t):COLOR{
            float3 lightDir = normalize(float3(_LightPosX,_LightPosY,_LightPosZ) - t.tex0);

            float4 col = float4(1,1,1,1)*dot(t.tex1,lightDir);
            return col;




        } 

        ENDCG






    }


} 
FallBack "Diffuse"

}

1 个答案:

答案 0 :(得分:0)

texcoords之间没有差异。

闪电的外观主要取决于您用于计算的法线。在这两种情况下,你都预先计算顶点的法线,因此给出相同的结果,因为你对整个三角形使用相同的法线。

如果你改为在片段中进行计算,你会得到每个像素的一个法线,从而得到更平滑的结果。

每像素着色器

tex vert(float4 pos:POSITION,out float4 oPos:SV_POSITION,float3 normal:Normal)
{
    oPos = mul(UNITY_MATRIX_MVP,pos);
    tex t;
    t.tex0 = mul(_Object2World,pos);
    t.tex1 = float4(normal,0);

    return t;
}

float4 frag(tex t):COLOR
{
    float3 lightDir = normalize(float3(_LightPosX,_LightPosY,_LightPosZ) - t.tex0);

    float4 normal = normalize(mul(_Object2World,float4(t.tex1,0)));
    float4 col = float4(1,1,1,1)*dot(normal, lightDir);
    return col;
}