OpenGL如何在片段着色器上插入变量变量,即使它们仅在顶点着色器上设置了三次?

时间:2014-04-21 16:55:26

标签: opengl glsl shader varying

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

首先,假设顶点着色器每顶点运行一次是错误的。使用索引渲染,基元组装通常可以基于顶点索引访问后T& L缓存(先前顶点着色器调用的结果)以消除多次评估顶点。但是,几何着色器等新功能很容易导致这种情况发生故障。

关于片段着色器如何获取其值,通常在光栅化期间完成。基于片段相对于用于构建基元的顶点的距离,沿着基元的表面(在这种情况下为三角形)内插这些每顶点属性。在DX11中,插值可以推迟到片段着色器本身运行(称为“拉模型”插值),但传统上这是在光栅化过程中发生的事情。