首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION

OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION
EN

Stack Overflow用户
提问于 2014-10-15 08:51:42
回答 1查看 1.5K关注 0票数 1

我用SDL窗口编写了一个OpenGL应用程序。在MacOSX10.9上运行OpenGL 4.1的核心配置文件。命令glClearColor工作得很好,我在屏幕上得到了正确的颜色。但是在我的呈现器中,每次执行命令glEnableVertexAttribArrayglDrawArrays时,我都会得到glEnableVertexAttribArray错误。

这就是守则:

顶点着色器:

代码语言:javascript
运行
复制
#version 410

in vec4 position;

void main(void)
{
    gl_Position = position;
}

片段着色器:

代码语言:javascript
运行
复制
#version 410

out vec4 out_Color;

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

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

用数据创建缓冲区:

代码语言:javascript
运行
复制
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);

呈现:

代码语言:javascript
运行
复制
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);

输出:

EN

回答 1

Stack Overflow用户

发布于 2014-10-15 12:49:36

正如BDL已经说过的:解决方案是创建一个VAO。作为一个简短的描述:一个VAO (顶点数组对象)是一个VBO的集合,它描述了着色器的顶点布局和顶点。

这里有更多的信息:

因此,我更改了以下代码块:

缓冲区:

代码语言:javascript
运行
复制
    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);

呈现:

代码语言:javascript
运行
复制
    glUseProgram(m_ShaderProgram);

    glBindVertexArray(m_VertexBufferArray);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(0);

    glUseProgram(0);

结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26378289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档