Справка glScissor (iPhone OpenGL ES) - PullRequest
       32

Справка glScissor (iPhone OpenGL ES)

3 голосов
/ 26 марта 2009

Я пытаюсь использовать glScissor, чтобы изолировать только те части экрана, которые требуют обновления. У меня есть игровая область, где мне нужно обновлять каждый кадр, но область пользовательского интерфейса должна обновляться гораздо реже. С областью игры все в порядке, но область пользовательского интерфейса постоянно мерцает, что похоже на старые данные буфера.

Что мне не хватает?

Вот мой код рендеринга:

[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 ]

4 голосов
/ 27 марта 2009

Используете ли вы kEAGLDrawablePropertyRetainedBacking в вашем CAEAGLLayer? Если вы не установите это значение на YES, то содержимое вашего буфера не гарантированно будет сохранено после его рендеринга. Другими словами, они выполняют рендеринг с двойной буферизацией: есть 2 отдельных буфера. Один отображается, другой отображается. Когда вы отображаете один кадр и отображаете его, следующий кадр отображается в другом буфере, поэтому содержимое не сохраняется. (Это объясняет, почему вы видите мусор, если не очищаете этот фрагмент экрана.) Если вы используете этот флаг, графическая система, вероятно, копирует данные во время переворота, чтобы сохранить содержимое.

Использование этого флага приведет к тому, что вашему приложению потребуется больше памяти и больше времени для рендеринга, поэтому оно может не стоить того, что вы провели выше. Вам придется профилировать и посмотреть. (Подробнее об этом см. документы Apple .)

Вы также можете взглянуть на демонстрационную версию GLPaint - она ​​использует это свойство, чтобы избежать перерисовки экрана каждый раз.

1 голос
/ 27 марта 2009

Вы абсолютно скучаете:

glEnable(GL_SCISSOR_TEST);

Хотя я не уверен, что этого достаточно, чтобы объяснить артефакты, которые вы видите, просто хотел указать на это. Согласно документации тест ножниц по умолчанию не включен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...