尽管有vao,glVertexAttribPointer导致无效的操作错误

时间:2015-03-03 00:19:05

标签: c++ opengl sdl-2

可能是一个简单的问题,因为我可能搞砸了一些傻话。

我一直在尝试让我的旧笔记本电脑上的渲染系统在我的空闲时间工作。我遇到了问题,并认为它与我的程序的原始设计有关,但现在我不确定它是否是那样的。我已将渲染调用缩小为简单的渲染三角形示例,但仍然出现错误。

void RenderSystem::Render()
{
    glClear( GL_COLOR_BUFFER_BIT );
    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray( vao );

    glUseProgram( shaderProgram );
    CheckForError();
    glEnableVertexAttribArray( coord3dAttrib );
    CheckForError();

    GLfloat triangle[] = {
        0.0, 0.8, 0.0,
        -0.8, -0.8, 0.0,
        0.8, -0.8, 0.0,
    };

    glVertexAttribPointer(
        coord3dAttrib,
        3,
        GL_FLOAT,
        GL_FALSE,
        0,
        triangle
    );
    CheckForError();

    glDrawArrays(GL_TRIANGLES, 0 , 3);
    CheckForError();

    glDisableVertexAttribArray( coord3dAttrib );
    CheckForError();

    SDL_GL_SwapWindow( window );
}

忽略过多的CheckForError函数调用 - 这只是为了确定导致错误的函数。它肯定发生在我调用glVertexAttribPointer之后。

值得注意的是,所有着色器和程序都已正确编译。上下文已初始化并由SDL2处理,并且在上下文初始化方面没有错误。我得到的唯一奇怪的错误是在调用SDL_GL_SetSwapInterval(0)以关闭vsync时无效的枚举。

此外,这台笔记本电脑是一台旧笔记本电脑,我开始考虑这样一个事实,即这台计算机的驱动程序/硬件可能太旧而无法真正实现这种更现代的GL渲染风格。在这种情况下,有没有一种方法可以测试哪个版本的GL应该在这个硬件上运行? (我在Crunchbang,一个linux debian发行版.Iirc,我已经设置并正确安装了很多驱动程序和标题,所以我认为它应该可行,但如果驱动程序问题导致这种情况,我会'我会更多地研究它。)

任何线索?我假设自从我上次使用OpenGL以来已经有一段时间没有基本的东西了。

1 个答案:

答案 0 :(得分:1)

我认为你的绑定出错了。您只需要为VAO生成一次名称,绑定并设置缓冲区,然后使用指定的名称稍后将其绑定。

所以,你应该做以下几点。

  1. 在某些初始化方法中(当您设置缓冲区时)为VAO变量生成名称:

    GLuint vao; // make this accessible in global scope or through some class
    glGenVertexArrays(1, &vao);
    
  2. 使用以前分配的名称到变量vao,在渲染方法中调用bind函数,如前所述:

    glUseProgram( shaderProgram );
    glBindVertexArray( vao );
    
  3. 我认为这可能是你的答案,最后,这就是我习惯看到VAO在书籍和教程中处理的方式。