典型的着色器是这样的:
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?
答案 0 :(得分:0)
顶点和片段着色器执行的计数不是直接连接的。
如果你有一个三角形,你是正确的,顶点着色器将运行三次,每个顶点一次。但随后它的结果被内插 - 也就是说,光栅化 - 但是最终投影的屏幕三角形覆盖了许多片段。它可能是屏幕上的每个像素都是一个巨大的三角形,或者对于一个离屏的三角形没有。如果有任何可见像素,那么片段着色器将为每个像素运行一次(错误,片段,如GL命名法所示)。
因为值是在顶点之间插值的,所以你可能得到的大多数片段的值都不是任何单个顶点的值,除非你将相同的值传递给所有这三个顶点 - 例如,如果你有所有模型中的红色顶点为v.color
,然后传递给o.color
和i.color
将在任何地方显示为常量。即使这样,值仍然被插值,但由于它们都是相同的,因此结果实际上是恒定的。
这对你有意义吗?