为什么在Vertex和Fragment着色器之间传递参数是可以的

时间:2015-06-13 08:50:53

标签: shader vertex cg

典型的着色器是这样的:

struct vin_vct 
        {
            float4 vertex : POSITION;
            float4 color : COLOR;
            float2 texcoord : TEXCOORD0;
        };

        struct v2f_vct
        {
            float4 vertex : POSITION;
            fixed4 color : COLOR;
            float2 texcoord : TEXCOORD0;
        };

        v2f_vct vert_vct(vin_vct v)
        {
            v2f_vct o;
            o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
            o.color = v.color;
            o.texcoord = v.texcoord;
            return o;
        }

        fixed4 frag_mult(v2f_vct i) : COLOR
        {
            fixed4 col = tex2D(_MainTex, i.texcoord) * i.color;
            return col;
        }

我感到困惑的是: vert_vct被调用每个顶点; frag_mult被称为每个片段(大多数情况下为像素);

因此,基本上frag_mult将使用vert_vct运行不同的时间,例如,frag mult运行10次,vert_vct运行3次以获得三角形。然后每次frag_mult运行时它将接受vert_vct传递的参数,然后如果运行时间不同,如何在frag和vert之间进行映射,如何确定哪个vert_vct将传递给指定的frag_mult?

1 个答案:

答案 0 :(得分:0)

顶点和片段着色器执行的计数不是直接连接的。

如果你有一个三角形,你是正确的,顶点着色器将运行三次,每个顶点一次。但随后它的结果被内插 - 也就是说,光栅化 - 但是最终投影的屏幕三角形覆盖了许多片段。它可能是屏幕上的每个像素都是一个巨大的三角形,或者对于一个离屏的三角形没有。如果有任何可见像素,那么片段着色器将为每个像素运行一次(错误,片段,如GL命名法所示)。

因为值是在顶点之间插值的,所以你可能得到的大多数片段的值都不是任何单个顶点的值,除非你将相同的值传递给所有这三个顶点 - 例如,如果你有所有模型中的红色顶点为v.color,然后传递给o.colori.color将在任何地方显示为常量。即使这样,值仍然被插值,但由于它们都是相同的,因此结果实际上是恒定的。

这对你有意义吗?