opengl es — пытаетесь получить полноэкранные «трассы» — режим с одним буфером или скопировать фронтбуфер?

#opengl-es #flicker

#opengl-es #мерцание

Вопрос:

я пытаюсь получить полноэкранный эффект «следа», подобный приведенному здесь:http://elenzil.com/progs/js1k

традиционный способ сделать это — не очищать изображение в начале рендеринга, а вместо этого наложить на большой многоугольник того же цвета, что и фон, с низким уровнем альфа.

рисование многоугольника в OpenGL ES довольно простое:

 glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

GLfloat clearRectPts[] = {
                          -0.5f, -0.5f,
                          -0.5f,  0.5f, 
                           0.5f, -0.5f,
                           0.5f,  0.5f,
                         };
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0f, 0.0f, 0.0f, 30.0f / 255.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT , 0, clearRectPts);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
  

но есть одна проблема,
то есть текущие операции gl происходят с обратным буфером,
который устарел по сравнению с передним буфером.
в итоге получаются «заикающиеся» изображения.

прежде чем я перейду к рендерингу закадровой текстуры и тому подобному, есть ли известный способ сделать это?

очевидные решения, которые я хотел бы найти, — это любое из этих:

  • скопируйте передний буфер в задний буфер в начале рендеринга.
  • вместо замены буферов, скопируйте задний буфер на передний.
  • запускайте с одной буферизацией.

Ответ №1:

понял это. kEAGLDrawablePropertyRetainedBacking должно быть TRUE, как в следующем:

         eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithBool:TRUE],
                                    kEAGLDrawablePropertyRetainedBacking,
                                    kEAGLColorFormatRGBA8,
                                    kEAGLDrawablePropertyColorFormat,
                                    nil];