【问题标题】:unity per fragment shading fail每个片段着色失败的统一性
【发布时间】:2014-08-27 08:11:47
【问题描述】:

我编写了两个着色器,一个用于每个顶点着色,另一个用于每个片段着色,都模拟点光漫射照明,两个着色器都可以正常工作而不会弹出错误,但是每个片段着色器的渲染模型似乎有与逐顶点的结果相同,我的意思是顶点之间的逐片段平滑效果看起来与逐顶点线性插值结果只有 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"

}

【问题讨论】:

    标签: unity3d shader


    【解决方案1】:

    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;
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多