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

OpenGL中3D投影功能正常,但相机移动时立方体残留轨迹的问题求助

解决立方体移动时的轨迹残留问题

嘿,这个轨迹问题其实很常见——你只是忘记在每一帧清除颜色缓冲区了!

问题根源

你的代码当前只在每一帧清除了深度缓冲区:

glClear(GL_DEPTH_BUFFER_BIT);

但OpenGL的绘制是基于之前帧的颜色缓冲区内容进行叠加的,旧帧中立方体的像素并没有被清除,当相机位置变化后,新的立方体图像绘制在旧图像之上,就会留下拖尾轨迹。

解决方案

只需要两步就能修复:

  1. 设置清除颜色:在初始化阶段(创建完OpenGL上下文后)添加一行代码,定义帧清除时的背景色(比如黑色):
// 在gladLoadGLLoader之后添加
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  1. 同时清除颜色和深度缓冲区:将主循环中的glClear调用修改为同时清除两个缓冲区:
// 替换原来的glClear行
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

修改后的关键代码片段

初始化部分:

gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress);
// 添加清除颜色设置
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

Mat_iden(one[0], 3);
Mat_iden(two[0], 3);
Mat_iden(three[0], 3);

主循环中的绘制部分:

glUseProgram(sp.p);
glUniformMatrix3fv(2, 1, GL_FALSE, one[0]);
glUniformMatrix3fv(3, 1, GL_FALSE, two[0]);
glUniformMatrix3fv(4, 1, GL_FALSE, three[0]);
glUniform3f(5, cam.x, cam.y, cam.z);

// 同时清除颜色和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
SDL_GL_SwapWindow(w);

这样修改后,每一帧开始时屏幕都会被你设置的背景色完全覆盖,新绘制的立方体就不会和旧帧内容叠加,轨迹残留的问题就解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:27:51