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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:48:02