对 glVertexAttribPointer 索引参数的说明
Clarification on glVertexAttribPointer index paramter
我有一个非常简单的程序可以在 OpenGL 中显示 3D 三角形。我输入的 hat 值,它显示不正确。我将以下数组放入顶点缓冲区
float triangle[] = {
// x y z r g b a
0.2f, -0.2f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.2f, -0.2f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.2f, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, -0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};
然后我使用以下方法将它们传递给顶点着色器
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
但输出三角形有一个奇怪的蓝色区域,即使位置正确,这也没有意义,因为输入颜色应该是黑色。我看到有些人将索引用作 sizeof(float) * 3 和 sizeof(float) * 4,但这会使三角形变绿并导致位置错误。 docs.gl 条目非常模糊,没有提供任何示例。这是我的着色器
片段着色器
#version 330 core
out vec4 color;
in vec4 outColor;
void main() {
out vec4 outColor;
uniform mat4 transform;
void main() {
gl_Position = transform * inPos;
outColor = inColor;
};
这里有什么问题?
如果绑定了命名缓冲区对象,则 glVertexAttribPointer
的最后一个参数将被视为缓冲区数据存储中的字节偏移量。
颜色属性的偏移量为3*sizeof(float)
字节:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 7,
(void*)(sizeof(float) * 3)); // <--- byte offset
该属性由7个组成部分组成(x, y, z, r、g、b、a)。顶点坐标的偏移量为 0,因为这是元组中的前 3 个分量。颜色的偏移量是3*sizeof(float)
,因为这是从4到7的分量。
我有一个非常简单的程序可以在 OpenGL 中显示 3D 三角形。我输入的 hat 值,它显示不正确。我将以下数组放入顶点缓冲区
float triangle[] = {
// x y z r g b a
0.2f, -0.2f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.2f, -0.2f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.2f, 0.2f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, -0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};
然后我使用以下方法将它们传递给顶点着色器
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
但输出三角形有一个奇怪的蓝色区域,即使位置正确,这也没有意义,因为输入颜色应该是黑色。我看到有些人将索引用作 sizeof(float) * 3 和 sizeof(float) * 4,但这会使三角形变绿并导致位置错误。 docs.gl 条目非常模糊,没有提供任何示例。这是我的着色器
片段着色器
#version 330 core
out vec4 color;
in vec4 outColor;
void main() {
out vec4 outColor;
uniform mat4 transform;
void main() {
gl_Position = transform * inPos;
outColor = inColor;
};
这里有什么问题?
如果绑定了命名缓冲区对象,则 glVertexAttribPointer
的最后一个参数将被视为缓冲区数据存储中的字节偏移量。
颜色属性的偏移量为3*sizeof(float)
字节:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 7,
(void*)(sizeof(float) * 3)); // <--- byte offset
该属性由7个组成部分组成(x, y, z, r、g、b、a)。顶点坐标的偏移量为 0,因为这是元组中的前 3 个分量。颜色的偏移量是3*sizeof(float)
,因为这是从4到7的分量。