【问题标题】:Clarification on glVertexAttribPointer index paramter关于 glVertexAttribPointer 索引参数的说明
【发布时间】:2020-09-16 04:42:38
【问题描述】:

我有一个非常简单的程序可以在 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;
    };

这里有什么问题?

【问题讨论】:

    标签: c opengl 3d glsl vertex-attributes


    【解决方案1】:

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

    【讨论】:

    • 由于 void 指针类型,我一直认为最后一个参数无关紧要,但我错了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2017-11-16
    • 2021-03-10
    • 2011-02-04
    相关资源
    最近更新 更多