顶点着色器如何将颜色信息传递给片段着色器?

RnM*_*Mss 21 opengl shader glsl

在一个简单的hello-world OpenGL程序中,它简单地在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形用渐变填充.

但是当我使用这样的着色器时:

顶点着色器:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)

其中的属性aVertexaColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.

片段着色器:

varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)

三角形仍然充满了渐变,这里有一个问题:

如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.

那么渐变来自哪里?

或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?

joz*_*yqk 17

片段着色器中的"变化"变量具有在顶点着色器阶段给出的值之间线性插值的结果(基于顶点之间的片段的相对位置).

也就是说,当光栅化器在像素处吐出片段时,其位置也相对于重心坐标中的三角形顶点给出.然后使用这些坐标来插入来自顶点着色器的所有变化变量.在大多数情况下,这就是你想要的,而且从非插值中获得的速度现在非常微不足道.

使用关键字"flat"将禁用插值,而是使用第一个顶点的值(我不是100%肯定"平面"随着我改用使用更新版本的GLSL的输入/输出关键字而变化) .

另外,如果片段需要来自每个顶点的一些值,我发现这特别有用.在这种情况下,我flat out myVertexValue[3]在几何着色器中使用(例如这里).

  • 我突然意识到,在应用插值之前,不需要知道变量是关于颜色的.实际上,coords,normals,TexCoords和一切都是顶点之间的插值. (4认同)