【问题标题】:OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATIONOSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION
【发布时间】:2014-10-15 08:51:42
【问题描述】:

我用 SDL 窗口编写了一个 OpenGL 应用程序。在 Mac OSX 10.9 上运行 OpenGL 4.1 的核心配置文件。命令glClearColor 效果很好,我在屏幕上得到了正确的颜色。但是在我的渲染器中,每次执行命令glEnableVertexAttribArrayglDrawArrays 时都会出现GL_INVALID_OPERATION 错误。

那是代码:

顶点着色器:

#version 410

in vec4 position;

void main(void)
{
    gl_Position = position;
}

片段着色器:

#version 410

out vec4 out_Color;

void main(void)
{
    out_Color = vec4(0.0, 1.0, 0.0, 1.0);
}

所有着色器都编译并链接到一个程序。没有链接错误!

用数据创建缓冲区:

static const float VertexBufferData[] = {
            0.75f, 0.75f, 0.0f, 1.0f,
            0.75f, -0.75f, 0.0f, 1.0f,
            -0.75f, -0.75f, 0.0f, 1.0f,
 };

 glGenBuffers(1, &m_VertexBuffer);
 glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
 glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW);
 glBindBuffer(GL_ARRAY_BUFFER, 0);

渲染:

glUseProgram(m_ShaderProgram);

glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);

glEnableVertexAttribArray(0);

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

// glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);

glDisableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

glUseProgram(0);

输出:

【问题讨论】:

  • 据我所知,在核心配置文件中不允许在没有活动 VAO 的情况下进行绘图。尝试在 glBindBuffer 之前生成一个 vao 并绑定它。
  • 好的。这就是问题所在。在我看来有点奇怪。为什么我需要 VAO……我觉得我必须再次阅读基础知识。 :-)
  • 如果您没有显式创建和绑定 VAO,您将只使用默认 (0) VAO。核心配置文件中不再允许使用任何类型的默认对象。从规范中,在“已弃用和删除的功能”下:“默认顶点数组对象(名称为零)也已弃用。”

标签: c++ macos opengl


【解决方案1】:

AS BDL 已经说过:解决方案是创建一个 VAO。简要说明:VAO(Vertex Array Object)是 VBO 的集合,它描述了着色器的顶点布局和顶点。

更多信息在这里:

所以我更改了以下代码块:

缓冲区:

    static const float VertexBufferData[] = {
            0.75f, 0.75f, 0.0f, 1.0f,
            0.75f, -0.75f, 0.0f, 1.0f,
            -0.75f, -0.75f, 0.0f, 1.0f,
        };

    glGenVertexArrays(1, &m_VertexBufferArray);
    glBindVertexArray(m_VertexBufferArray);

    glGenBuffers(1, &m_VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glBindVertexArray(0);

渲染:

    glUseProgram(m_ShaderProgram);

    glBindVertexArray(m_VertexBufferArray);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(0);

    glUseProgram(0);

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多