OpenGL中3D投影功能正常,但相机移动时立方体残留轨迹的问题求助
解决立方体移动时的轨迹残留问题
嘿,这个轨迹问题其实很常见——你只是忘记在每一帧清除颜色缓冲区了!
问题根源
你的代码当前只在每一帧清除了深度缓冲区:
glClear(GL_DEPTH_BUFFER_BIT);
但OpenGL的绘制是基于之前帧的颜色缓冲区内容进行叠加的,旧帧中立方体的像素并没有被清除,当相机位置变化后,新的立方体图像绘制在旧图像之上,就会留下拖尾轨迹。
解决方案
只需要两步就能修复:
- 设置清除颜色:在初始化阶段(创建完OpenGL上下文后)添加一行代码,定义帧清除时的背景色(比如黑色):
// 在gladLoadGLLoader之后添加 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- 同时清除颜色和深度缓冲区:将主循环中的
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
相关产品推荐
相关产品推荐

