模型,顶点着色器,片元着色器的关系

2019-07-12  本文已影响0人  鬼鬼_de

模型,顶点着色器,片元着色器的关系

Shader "Custom/Test" {
    SubShader{
        Pass{
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        struct a2v {
            float4 vertex : POSITION;   
            float3 normal:NORMAL;   
            float4 texcoord:TEXCOORD0;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed3 color : COLOR0;
        };

        v2f vert(a2v v) : SV_POSITION{
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
            o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
            return o;
        }

        fixed4 frag(v2f i) : SV_Target{
            return fixed4(i.color,1.0f);
        }
        ENDCG
        }
    }
}

结构体a2v,里面塞进了顶点着色器需要的模型数据。模型的数据传递给顶点着色器,然后在顶点着色器里面编程,来计算各种必要的信息,输出到结构体v2f里面,给接下来的片元着色器准备好数据。

struct a2v {
    float4 vertex : POSITION; 
    float3 normal : NORMAL; 
    float4 tangent : TANGENT;
    float4 texcoord : TEXCOORD0;
    fixed4 color : COLOR;
};

结构体v2f,把顶点着色器输出的数据整好,然后传递给片元着色器。在片元着色器里面进行复杂的计算,得到正确的颜色,最后输出到渲染目标中。

struct v2f {
    float4 pos : SV_POSITION;
    fixed3 color : COLOR0;
    float4 texcoord : TEXCOORD0;
};
顶点着色器,片元着色器的数据来源与去向

TEXCOORD 还可以用于储存各种向量,例如灯光方向,视角方向等

学习资料:《unity shader入门精要》

上一篇 下一篇

猜你喜欢

热点阅读