OpenGL 如何在绘制数组中设置属性

OpenGL how to set attribute in draw arrays

我有一个包含我的数据的 GLfloat 数组,如下所示:

GLfloat arr[] = {
     //position    //color
     300, 380, 0,  0, 1, 0,
     300, 300, 0,  1, 1, 0,
     380, 300, 0,  0, 1, 1,
     380, 380, 0,  1, 0, 1
};

我正在尝试用各自的颜色绘制 4 个点,目前我正在这样做:

glPointSize(10);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, arr);
glDrawArrays(GL_POINTS, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);

但是我尝试修改它以接受颜色值失败了。

顶点和片段着色器:

#version 330 core
out vec4 FragColor;
in vec3 ourColor;

void main()
{
    FragColor = vec4(ourColor, 1.0);
} 

#version 330 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec3 color;

out vec3 ourColor;

uniform mat4 projection;

void main()
{
    gl_Position = projection * vec4(position.xy, 0.0, 1.0);
    ourColor = color;
}

您正在使用着色器程序。顶点属性的属性索引为 0,颜色的索引为 1。使用 glVertexAttribPointer 定义通用顶点属性数据的 2 个数组:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, arr);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(flaot)*6, arr);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(flaot)*6, arr+3);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

属性的顶点数组由具有 6 个分量(x、y、z、r、g、b)的元组组成。因此,连续通用顶点属性 (stride) 之间的字节偏移量为 sizeof(flaot)*6 字节。
第一个顶点的地址是arr,第一个颜色的地址是arr+3(分别是(unsigned char*)arr + sizeof(float)*3)。