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

Opengl 顶点着色器如何将颜色信息传递给片段着色器?,opengl,glsl,shader,Opengl,Glsl,Shader,在一个简单的hello world OpenGL程序中,它只是在窗口上绘制一个静态三角形, 当我将三角形的3个顶点设置为红色、绿色和蓝色时,三角形将填充渐变 但是当我使用这样的着色器时: 顶点着色器: attribute vec4 aVertex; attribute vec4 aColor; varying vec4 vColor; void main(void) { gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix *

在一个简单的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;
}
varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}
其中属性
aVertex
aColor
来自顶点缓冲区,通过调用
glvertexattributepointer
传递

片段着色器:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}
varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}
三角形仍然充满了梯度,问题来了:

如果顶点着色器是按顶点计算的,则应为
vColor
的每个实例指定顶点的颜色。顶点颜色应为红色、绿色或蓝色,如顶点缓冲区中设置的

那么梯度是从哪里来的呢


或者,换句话说,在frag着色器中,
vColor
是插值颜色而不是顶点的颜色,这是什么时候发生的

渐变来自变化进入着色器时发生的顶点颜色之间的插值。如果不想插值,请在变化开始时使用“flat”关键字。 您的误解可能源于缺乏关于顶点和片段阶段如何工作的知识。它们的工作方式不同。顶点着色器是按顶点调用的,而片段是按像素调用的。默认情况下,插值会发生,因为需要覆盖由基元程序集定义的区域上光栅化阶段生成的片段。以及正如我所说,您可以通过“展开”禁用插值。在这种情况下,第一个顶点属性的颜色将定义形状的整体颜色。

片段着色器中的“变化”变量会在顶点着色器阶段给出的值之间进行线性插值(基于顶点之间碎片的相对位置)

也就是说,当光栅化器在像素处吐出一个片段时,它的位置也会在重心坐标中相对于三角形顶点给出。这些坐标然后用于插值顶点着色器中的所有变量。在大多数情况下,这是您想要的,不插值所获得的速度非常小这几天我不喜欢

使用关键字“flat”将禁用插值,而是使用第一个顶点的值(我不能100%确定“flat”是否适用于“Variable”,因为我已切换到使用in/out关键字)


另一方面,如果片段需要来自每个顶点的一些值,我发现这一点特别有用.

我突然意识到,在应用插值之前,不需要知道变量与颜色有关。实际上,坐标、法线、TexCoords和所有东西都是顶点之间的插值。以下是有关在vec或mat值之间变化的情况的更多信息: