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

时间:2015-08-07 14:18:43

标签: opengl graphics glsl shader

我正在编写一个简单的程序,使用着色器在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。我该怎么做?

1 个答案:

答案 0 :(得分:1)

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

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);
}

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

in vec4 attrib_Fragment_Colour;

out vec4 Out_Colour;

void main(void)
{
    Out_Colour = attrib_Fragment_Colour;
}