OpenGL如何在片段着色器上插值变化的变量,即使它们在顶点着色器上只设置了三次



由于顶点着色器每个顶点运行一次(在三角形中平均运行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_Colore 3次(在三角形中)。

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

首先,假设每个顶点运行一次顶点着色器是错误的。使用索引渲染,基元程序集通常可以访问后T&L缓存(以前顶点着色器调用的结果),以消除对顶点进行多次求值。但是,几何体着色器等新事物很容易导致这种情况发生故障。

至于片段着色器如何获得其值,通常在光栅化过程中完成。这些逐顶点属性是根据片段相对于用于构建基本体的顶点的距离沿着基本体(在本例中为三角形)的曲面进行插值的。在DX11中,插值可以推迟到片段着色器本身运行(称为"拉模型"插值),但传统上这是在光栅化过程中发生的事情。

最新更新