glScissor帮助(iPhone OpenGL ES)

时间:2009-03-26 15:28:58

标签: iphone cocoa-touch opengl-es

我正在尝试使用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];

2 个答案:

答案 0 :(得分:4)

您在kEAGLDrawablePropertyRetainedBacking中使用的是CAEAGLLayer吗?如果未将其设置为YES,则在呈现缓冲区后不保证缓冲区的内容。换句话说,他们正在进行双缓冲渲染:有2个独立的缓冲区。一个正在显示,一个正在呈现。渲染一帧并显示它时,下一帧将渲染到另一个缓冲区,因此不会保留内容。 (这解释了为什么你看到垃圾,如果你没有清除屏幕的那一块。)如果你使用这个标志,图形系统可能在翻转期间复制数据,所以内容被保留。

使用此标志将使您的应用程序占用更多内存并有更多时间进行渲染,因此对于上面的优化可能不值得。您必须对其进行分析并查看。 (有关详细信息,请参阅the Apple docs。)

您还可以查看GLPaint演示 - 它使用此属性来避免每次重绘屏幕。

答案 1 :(得分:1)

你绝对错过了:

glEnable(GL_SCISSOR_TEST);

虽然我不确定这是否足以解释你所看到的文物,但只想指出它。根据{{​​3}},默认情况下不启用剪刀测试。