OpenGL 4.5 直接状态访问 渲染一个三角形 - GL_INVALID_VALUE [repicate]。

问题描述 投票:0回答:1

描述

我目前正在学习OpenGL,想尝试OpenGL 4.5的直接状态访问扩展。因此,我设置了一个简单的三角形渲染示例(在3D中),它应该渲染我的三角形。下面的代码每一帧都会执行,并在3D空间中绘制一个三角形。

    void Geometry::draw(glm::vec3 pos, glm::vec3 pos1, glm::vec3 pos2) {
        float vertices[9] = {
            pos.x, pos.y, pos.z,
            pos1.x, pos1.y, pos1.z,
            pos2.x, pos2.y, pos2.z
        };

        unsigned int m_VaoID;
        glGenVertexArrays(1, &m_VaoID);
        glBindVertexArray(m_VaoID);

        unsigned int m_VboID;
        glGenBuffers(1, &m_VboID);
        glBindBuffer(GL_ARRAY_BUFFER, m_VboID);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, 0);

        Shader shader = Shader("../../shader.glsl");
        shader.compileShader();
        shader.useShader();

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDeleteVertexArrays(1, &m_VaoID);
        glDeleteBuffers(1, &m_VboID);
    }

然而,当我修改代码以使用直接状态访问扩展时,它不再渲染一个三角形,而是产生错误信息。

    void Geometry::drawDSA(glm::vec3 pos, glm::vec3 pos1, glm::vec3 pos2) {
        float vertices[9] = {
            pos.x, pos.y, pos.z,
            pos1.x, pos1.y, pos1.z,
            pos2.x, pos2.y, pos2.z
        };

        unsigned int m_VaoID;
        glCreateVertexArrays(1, &m_VaoID);
        glVertexArrayAttribFormat(m_VaoID, 0, 3, GL_FLOAT, GL_FALSE, 0);

        unsigned int m_VboID;
        glCreateBuffers(1, &m_VboID);
        glNamedBufferData(m_VboID, sizeof(vertices), vertices, GL_STATIC_DRAW);

        glVertexArrayAttribBinding(m_VaoID, 0, m_VboID);

        Shader shader = Shader("../../shader.glsl");
        shader.compileShader();
        shader.useShader();

        glBindVertexArray(m_VaoID);
        glBindBuffer(GL_ARRAY_BUFFER, m_VboID);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glDeleteVertexArrays(1, &m_VaoID);
        glDeleteBuffers(1, &m_VboID);
    }

这两个方法在我的 更新圈 与相同的值(在-1.f和0.f之间)。

错误输出。

以下是我收到的错误的控制台输出。

[OpenGL Debug HIGH] GL_INVALID_VALUE in glVertexArrayAttribBinding(bindingindex=16 >= GL_MAX_VERTEX_ATTRIB_BINDINGS)
[OpenGL Debug HIGH] GL_INVALID_VALUE in glVertexArrayAttribBinding(bindingindex=17 >= GL_MAX_VERTEX_ATTRIB_BINDINGS)
[OpenGL Debug HIGH] GL_INVALID_VALUE in glVertexArrayAttribBinding(bindingindex=18 >= GL_MAX_VERTEX_ATTRIB_BINDINGS)
[OpenGL Debug HIGH] GL_INVALID_VALUE in glVertexArrayAttribBinding(bindingindex=19 >= GL_MAX_VERTEX_ATTRIB_BINDINGS)

我目前所做的尝试

我查看了Khronos Wiki和docs.gl文档,但我找不到为什么我的代码会产生上述错误,而不是渲染我的三角形。

c++ opengl opengl-4
1个回答
1
投票

三维参数 glVertexArrayAttribBinding 不是顶点缓冲区对象,而是一个绑定索引。它是一个任意的id,你必须选择它。下面的指令将绑定索引与指定的 VAO 的属性索引(0)关联。

glVertexArrayAttribBinding(m_VaoID, 0, m_VboID);

glVertexArrayAttribBinding(m_VaoID, 0, binding_index);

此外,你必须使用glVertexArrayVertexBuffer 将缓冲区对象关联到指定VAO的绑定索引。

glVertexArrayVertexBuffer(m_VaoID, binding_index, m_VboID, 0, sizeof(float) * 3);
© www.soinside.com 2019 - 2024. All rights reserved.