简体   繁体   English

OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION

[英]OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION

I programmed an OpenGL application with an SDL window. 我使用SDL窗口编写了OpenGL应用程序。 Core Profile running OpenGL 4.1 on a Mac OSX 10.9. 在Mac OSX 10.9上运行OpenGL 4.1的Core Profile。 The command glClearColor works great and I get the right color on screen. 命令glClearColor很好用,我在屏幕上得到正确的颜色。 But inside my renderer I got the GL_INVALID_OPERATION error everytime I execute the commands glEnableVertexAttribArray and glDrawArrays . 但是在我的渲染器内部,每次执行命令glEnableVertexAttribArrayglDrawArrays我都会遇到GL_INVALID_OPERATION错误。

That is the code: 那是代码:

Vertex Shader: 顶点着色器:

#version 410

in vec4 position;

void main(void)
{
    gl_Position = position;
}

Fragment Shader: 片段着色器:

#version 410

out vec4 out_Color;

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

All shader compile and linked to an program. 所有着色器都会编译并链接到程序。 No linking error! 没有链接错误!

Creating buffer with data: 用数据创建缓冲区:

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

Render: 渲染:

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

Output: 输出:

带有探查器描述的我的应用程序的输出

AS BDL already said: The solution is to create a VAO. AS BDL已经说过:解决方案是创建VAO。 As a short description: A VAO (Vertex Array Object) is a collection of VBOs, which describes the vertex layout and the vertices for the shader. 简短描述:VAO(顶点阵列对象)是VBO的集合,它描述了着色器的顶点布局和顶点。

More informations here: 更多信息在这里:

So I have changed the following code blocks: 因此,我更改了以下代码块:

Buffer: 缓冲:

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

Render: 渲染:

    glUseProgram(m_ShaderProgram);

    glBindVertexArray(m_VertexBufferArray);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(0);

    glUseProgram(0);

Result: 结果:

最终的工作结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM