繁体   English   中英

glScissor帮助(iPhone OpenGL ES)

[英]glScissor help (iPhone 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];

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

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

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

你绝对错过了:

glEnable(GL_SCISSOR_TEST);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM