9

由于顶点着色器每个顶点运行一次(这意味着在三角形中 3 次),如果变量变量仅被分配(如示例中所示)3 次,如何为每个片段计算变量?

片段着色器:

precision mediump float;
varying vec4 v_Color;

void main() {
    gl_FragColor = v_Color;
}

顶点着色器:

attribute vec4 a_Position;
attribute vec4 a_Color;

varying vec4 v_Color;

void main() {
    v_Color = a_Color;
    gl_Position = a_Position;
}

所以,问题是,这背后的系统如何知道,如何计算每个片段的变量 v_Color,因为这个着色器只分配 v_Color 3 次(在三角形中)。

4

2 回答 2

6

顶点着色器的所有输出都是每个顶点。当您v_Color在顶点着色器中设置时,它会将其设置在当前顶点上。当片段着色器运行时,它读取v_Color图元中每个顶点的值,并根据片段的位置在它们之间进行插值。

于 2014-04-21T17:16:06.190 回答
3

首先,假设顶点着色器对每个顶点运行一次是错误的。使用索引渲染,图元组件通常可以访问基于顶点索引的后期 T&L 缓存(先前顶点着色器调用的结果),以消除对顶点的多次评估。然而,诸如几何着色器之类的新事物很容易导致这种情况发生故障。

至于片段着色器如何取值,一般是在光栅化的时候完成的。基于片段相对于用于构建图元的顶点的距离,这些每个顶点的属性沿图元的表面(在本例中为三角形)进行插值。在 DX11 中,插值可以推迟到片段着色器本身运行(称为“拉模型”插值),但传统上这是在光栅化期间发生的事情。

于 2014-04-21T17:20:03.083 回答