OpenGL绘制的点短暂显示后消失:绘制调用与交换缓冲区问题
解决GL_POINTS绘制的点短暂显示后消失的问题
嘿,我明白你遇到的困扰了——用GL_POINTS依次绘制顶点时,刚出现的点很快就消失了。这其实是OpenGL渲染机制的特性导致的,咱们一步步来搞定它:
问题根源
你当前的代码逻辑是每次时间触发时只绘制新的单个点,但OpenGL的渲染循环通常会在每帧开始时调用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)清除帧缓冲内容。这就意味着,上一帧绘制的点会被清空,而你没有在新帧里重新绘制它们,所以老点就消失了。
修复方案:重绘所有已显示的点
最直接且高效的解决方法是,维护一个记录“已显示点数量”的变量,每次帧渲染时,把所有到时间该显示的点重新绘制一遍。这样即使缓冲被清空,所有该显示的点都会被重新画出来,不会消失。
修改后的核心代码示例
// 定义全局/类成员变量,记录已显示的点数量 int displayedCount = 0; double insertionRateTime = 0.0; // 初始时间阈值 const double insertionRate = 0.5; // 假设每0.5秒显示一个点 const int totalVertexCount = 100; // 你的顶点数组总长度 // 渲染循环内的逻辑 while (!glfwWindowShouldClose(window)) { double currentTime = glfwGetTime(); // 处理时间触发逻辑,更新已显示点的数量 if (currentTime > insertionRateTime && displayedCount < totalVertexCount) { cout << "insertionRateTime = " << insertionRateTime << " index " << displayedCount << endl; insertionRateTime += insertionRate; displayedCount++; } // 清除缓冲(常规操作,必须保留以保证每帧绘制环境干净) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制所有已经到时间该显示的点 glDrawArrays(GL_POINTS, 0, displayedCount); // 交换缓冲并处理事件 glfwSwapBuffers(window); glfwPollEvents(); }
关键说明
- 把原来只绘制单个点的逻辑,改成更新显示数量,然后在每帧固定绘制所有已达标的点。这样每帧都会重绘所有需要显示的点,避免被
glClear清空后消失。 - 加上
displayedCount < totalVertexCount的判断,防止超出你的顶点数组范围,引发内存错误。 - 如果你的渲染循环里没有
glClear,那可能是其他问题,但绝大多数OpenGL应用都会用它来保证每帧的干净绘制环境。
内容的提问来源于stack exchange,提问作者Nasser
相关产品推荐
相关产品推荐

