如何使用 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);
但是,该程序只是将每个顶点渲染为灰色。我想要做的是为每个顶点赋予自己的颜色。所以,有两件事我需要改变,但我不确定该怎么做:
- 我需要将颜色信息添加到顶点缓冲区。我是否只是通过用 7 个元素(3 个用于位置,4 个用于颜色)而不是 3 个元素定义每个顶点来做到这一点?但是我该如何告诉我的顶点着色器在哪里可以找到这些颜色信息呢?它会像
layout (location = 3) in vec4 colour
吗?
- 然后我需要将此颜色信息发送到片段着色器,然后将其分配给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;
}
我正在编写一个简单的程序来使用着色器在 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);
但是,该程序只是将每个顶点渲染为灰色。我想要做的是为每个顶点赋予自己的颜色。所以,有两件事我需要改变,但我不确定该怎么做:
- 我需要将颜色信息添加到顶点缓冲区。我是否只是通过用 7 个元素(3 个用于位置,4 个用于颜色)而不是 3 个元素定义每个顶点来做到这一点?但是我该如何告诉我的顶点着色器在哪里可以找到这些颜色信息呢?它会像
layout (location = 3) in vec4 colour
吗? - 然后我需要将此颜色信息发送到片段着色器,然后将其分配给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;
}