2

我有一个非常简单的程序来在 OpenGL 中显示一个 3D 三角形。我输入的帽子值,它没有正确显示。我将以下数组放入顶点缓冲区

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

这里有什么问题?

4

1 回答 1

0

如果绑定了命名缓冲区对象,则 的最后一个参数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 个组件(xyzrgba)组成。顶点坐标的偏移量为 0,因为这是元组中的前 3 个分量。颜色的偏移量是3*sizeof(float),因为这是从 4 到 7 的分量。

于 2020-09-16T04:59:34.317 回答