我正在尝试使用glScissor来仅隔离需要更新的屏幕部分。 我有一个游戏区域,我需要更新每一帧,但UI区域需要更频繁地更新。游戏区域很好,但UI区域不断闪烁,似乎是旧的缓冲区数据。
我错过了什么?
这是我的渲染代码:
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
if (needsUIUpdate)
{
// clear entire screen
glScissor(0, 0, 320, 480);
glClear(GL_COLOR_BUFFER_BIT);
needsUIUpdate = NO;
[self updateUI];
}
else
{
glScissor(0, 80, 320, 400);
glClear(GL_COLOR_BUFFER_BIT);
}
for (Cell* c in allCells)
[c animate];
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
答案 0 :(得分:4)
您在kEAGLDrawablePropertyRetainedBacking
中使用的是CAEAGLLayer
吗?如果未将其设置为YES
,则在呈现缓冲区后不保证缓冲区的内容。换句话说,他们正在进行双缓冲渲染:有2个独立的缓冲区。一个正在显示,一个正在呈现。渲染一帧并显示它时,下一帧将渲染到另一个缓冲区,因此不会保留内容。 (这解释了为什么你看到垃圾,如果你没有清除屏幕的那一块。)如果你使用这个标志,图形系统可能在翻转期间复制数据,所以内容被保留。
使用此标志将使您的应用程序占用更多内存并有更多时间进行渲染,因此对于上面的优化可能不值得。您必须对其进行分析并查看。 (有关详细信息,请参阅the Apple docs。)
您还可以查看GLPaint演示 - 它使用此属性来避免每次重绘屏幕。
答案 1 :(得分:1)
你绝对错过了:
glEnable(GL_SCISSOR_TEST);
虽然我不确定这是否足以解释你所看到的文物,但只想指出它。根据{{3}},默认情况下不启用剪刀测试。