OpenGLES - пытаясь получить полноэкранные "следы" - режим одного буфера или копирование фронтбуфера?
Я пытаюсь получить полноэкранный эффект "следа", подобный тому, что здесь: 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);
но есть Gotcha, который заключается в том, что текущие операции gl происходят с задним буфером, который устарел по сравнению с передним буфером. Таким образом, вы в конечном итоге с "заиканием" изображений.
прежде чем я пойду по пути рендеринга в закадровую текстуру и тому подобное, есть ли известный способ сделать это?
очевидные решения, которые я хотел бы найти, являются следующими:
- скопируйте передний буфер в задний буфер в начале рендеринга.
- вместо замены буферов скопируйте задний буфер на передний план.
- запустить с одиночным буфером.
1 ответ
Понял это. kEAGLDrawablePropertyRetainedBacking должен быть TRUE, как показано ниже:
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:TRUE],
kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8,
kEAGLDrawablePropertyColorFormat,
nil];