如何使用 OpenGL 在着色器中设置顶点的颜色

How to set the colour of a vertex in shaders with OpenGL

我正在编写一个简单的程序来使用着色器在 OpenGL 中渲染对象。

我的片段着色器目前是:

void main()
{
    gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
}

我的顶点着色器目前是:

layout (location = 0) in vec3 position; 
uniform mat4 projection_matrix;
uniform mat4 view_matrix;

void main()
{
    gl_Position = projection_matrix * view_matrix * vec4(position, 1.0);
}

而我的顶点缓冲区只是一个顶点列表,用于构成我要渲染的三角形。我告诉 OpenGL 如何解释缓冲区,如下所示:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

但是,该程序只是将每个顶点渲染为灰色。我想要做的是为每个顶点赋予自己的颜色。所以,有两件事我需要改变,但我不确定该怎么做:

  1. 我需要将颜色信息添加到顶点缓冲区。我是否只是通过用 7 个元素(3 个用于位置,4 个用于颜色)而不是 3 个元素定义每个顶点来做到这一点?但是我该如何告诉我的顶点着色器在哪里可以找到这些颜色信息呢?它会像 layout (location = 3) in vec4 colour 吗?
  2. 然后我需要将此颜色信息发送到片段着色器,然后将其分配给gl_FragColor。我该怎么做?

这是一个简单的着色器,可以满足您的需求:

layout(location = 0) in vec3 attrib_Position;
layout(location = 1) in vec4 attrib_Colour

out vec4 attrib_Fragment_Colour;

void main()
{
    attrib_Fragment_Colour = attrib_Colour;

    gl_Position = vec4(attrib_Position.xy, 0.0, 1.0);
}

请注意,位置更像是 "slot number" 而不是实际的物理偏移量。所以在这种情况下它是 1,而不是 3。我们还定义了一个名为 attrib_Fragment_Colour 的顶点着色器的输出。这是像素着色器的输入:

in vec4 attrib_Fragment_Colour;

out vec4 Out_Colour;

void main(void)
{
    Out_Colour = attrib_Fragment_Colour;
}