C++ OpenGL调用glBufferSubData无法修改顶点缓冲移动物体问题
问题原因&解决方法
1. 核心错误:GL_ARRAY_BUFFER绑定对象错误
你在绑定索引缓冲的代码末尾多写了一行完全多余的绑定操作:
glGenBuffers(1, &IB); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IB); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned int), indices, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, IB); // 错误行:把顶点缓冲绑定目标换成了索引缓冲
这行代码将GL_ARRAY_BUFFER的绑定对象从你创建的顶点缓冲VB,替换成了索引缓冲IB,后续你在渲染循环中调用glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(moveObject), moveObject);时,是往索引缓冲里写入顶点数据,根本没有修改你用来绘制的顶点缓冲内容,自然不会有任何效果。
2. 次要问题:顶点Y坐标逻辑错误
你在渲染循环中对Y坐标使用了累加操作:
moveObject[1] += abs(90 * sin(glfwGetTime()));
这样Y坐标会随着运行时间无限增大,很快就会超出正交投影视口范围,导致四边形看不到。
修改步骤
- 直接删除上面提到的多余绑定行
glBindBuffer(GL_ARRAY_BUFFER, IB); - 将Y坐标的累加操作改为基于初始值的赋值操作,示例:
float baseY1 = -50.0f, baseY2 = -90.0f; float offset = abs(90 * sin(glfwGetTime())); moveObject[1] = baseY1 + offset; moveObject[3] = baseY2 + offset; moveObject[5] = baseY2 + offset; moveObject[7] = baseY1 + offset; - 可选优化:在调用
glBufferSubData之前主动绑定一次顶点缓冲,避免后续其他操作修改绑定导致异常:glBindBuffer(GL_ARRAY_BUFFER, VB); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(moveObject), moveObject);
内容的提问来源于stack exchange,提问作者Razielruss
相关产品推荐
相关产品推荐

