我想在我的场景中画两层(比如说主层和调试信息层)。现在我用这种方式绘制图层:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
layer1->draw();
layer2->draw();
我想做这样的事情:
static int frameCount = 0;
layer1->draw();
if (frameCount % 2) {
layer2->draw();
}
frameCount++;
但我不想每秒钟画第二层。我想每帧画一层,但每秒钟都要重新绘制。例如,我用这种方式绘制图层:
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_POINTS, 0, vertexNumber);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
如何只在每秒钟重新绘制一层?
您必须使用后缓冲技术,因此:
- 重写渲染,使其输出到纹理而不是屏幕
- 在重绘事件中使用backbuffer纹理
有两种选择
- 每个层都有自己的目标纹理,在重新绘制时,你可以将它们组合到屏幕上
- 每次重绘都更新的层没有纹理,它直接渲染到设备上,最重要的是渲染较慢层的父纹理
选择对你更好的。我通常对每次重绘都有bool _redraw
,只有在层中发生变化时才重绘纹理。但是可视化每一帧的纹理内容。。。