You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用多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:

  1. 初始化阶段给每个结构新增GLuint vao成员,调用glGenVertexArrays(1, &xxx->vao)生成VAO,绑定VAO后再执行原有的VBO生成、glVertexAttribPointer、启用顶点属性的逻辑,最后解绑VAO和VBO。
  2. 绘制阶段绑定对应结构的VAO,不需要再重新设置顶点属性,直接执行后续的缓冲数据写入、绘制逻辑即可。

方案2(临时兼容方案,不推荐用于核心模式)

如果不想引入VAO,将glVertexAttribPointer和顶点属性启用的逻辑从初始化函数移到绘制函数中,每次绑定VBO之后先调用这两个接口配置顶点属性,再执行后续绘制逻辑。

其他注意点

你代码中default分支的清屏逻辑顺序错误,glClearColor需要在glClear之前调用才能生效,建议调整顺序。

内容的提问来源于stack exchange,提问作者Steve Frazee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:18:04