使用多VBO切换绘制时后绘制对象持续显示,是初始化或数据缓冲错误吗
问题原因
你遇到的问题核心是OpenGL顶点属性配置的存储逻辑错误:
glVertexAttribPointer调用时,会将当前绑定到GL_ARRAY_BUFFER的VBO关联到当前绑定的VAO的对应顶点属性槽位,该配置存储在VAO中,而非VBO或全局上下文,与后续GL_ARRAY_BUFFER的绑定变更无关。- 你没有显式创建VAO,使用的是OpenGL全局默认VAO,两个结构初始化时先后调用
glVertexAttribPointer会互相覆盖默认VAO的配置:后初始化的结构的VBO会被默认VAO记录为顶点数据源,切换回先初始化的结构时,即使你绑定了对应VBO到GL_ARRAY_BUFFER,绘制时依然会使用VAO中记录的后初始化的VBO作为数据源,才会出现后绘制的内容残留、先绘制的内容不显示的问题。
解决方案
方案1(推荐,符合OpenGL核心模式规范)
给每个数据结构独立创建VAO:
- 初始化阶段给每个结构新增
GLuint vao成员,调用glGenVertexArrays(1, &xxx->vao)生成VAO,绑定VAO后再执行原有的VBO生成、glVertexAttribPointer、启用顶点属性的逻辑,最后解绑VAO和VBO。 - 绘制阶段绑定对应结构的VAO,不需要再重新设置顶点属性,直接执行后续的缓冲数据写入、绘制逻辑即可。
方案2(临时兼容方案,不推荐用于核心模式)
如果不想引入VAO,将glVertexAttribPointer和顶点属性启用的逻辑从初始化函数移到绘制函数中,每次绑定VBO之后先调用这两个接口配置顶点属性,再执行后续绘制逻辑。
其他注意点
你代码中default分支的清屏逻辑顺序错误,glClearColor需要在glClear之前调用才能生效,建议调整顺序。
内容的提问来源于stack exchange,提问作者Steve Frazee
相关产品推荐
相关产品推荐

