可能是个简单的问题,因为我可能搞砸了一些愚蠢的事情。
我一直在尝试让闲暇时间在旧笔记本电脑上运行渲染系统。我当时遇到问题,并认为这与程序的原始设计有关,但是现在我不确定是否是那样。我已经将我的渲染调用简化为一个简单的渲染三角形示例,但仍然收到错误。
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? (我在Linux debian发行版Crunchbang上。Iirc,我已经正确安装并安装了许多驱动程序和头文件,因此我认为它应该可以工作,但是如果驱动程序问题导致了这一点,我将进行进一步研究。 )
有什么线索吗?我假设自上次使用OpenGL以来已经有一段时间了,我缺少一些基本的东西。
最佳答案
我认为您在绑定(bind)上错了。您只需为VAO生成一个名称,绑定(bind)并设置您的缓冲区,然后使用分配的名称将其绑定(bind)。
因此,您应该执行以下操作。
GLuint vao; // make this accessible in global scope or through some class
glGenVertexArrays(1, &vao);
vao
的名称,像以前一样在render方法中调用bind函数:glUseProgram( shaderProgram );
glBindVertexArray( vao );
我想这可能是您的答案,最后,这就是我习惯于在书本和教程中看到VAO的方式。
关于c++ - glVertexAttribPointer导致无效的操作错误,尽管有vao,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28821855/