Пиксельные буферы являются специфичным для платформы расширением OpenGL. В ES такого расширения нет, потому что объекты кадрового буфера являются частью основного API. Буферный объект кадра может использоваться для полного рендеринга вне экрана, обычно в текстуру, которая затем используется для некоторой другой задачи в конвейере рендеринга. Вот как в OpenGL ES достигаются такие эффекты, как затенение в буфер глубины и отложенный рендеринг.
Например, чтобы сгенерировать объект кадрового буфера с буферами цвета и глубины, связанными с текстурами, которые вы уже сгенерировали в другом месте, вы можете сделать:
glGenFramebuffers(1, &framebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colourTextureID, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTextureID, 0);
if((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE)
{
// there was some sort of problem
}
Вы бы использовали glBindFramebuffer
, чтобы связать этот буфер кадров позже. Затем вы должны перепривязать буфер кадров, который связан с дисплеем, если вы хотите визуализировать то, что действительно видно. Вы будете использовать EAGLContext -renderbufferStorage:fromDrawable:
где-нибудь для создания объекта буфера кадра, который использует CAEAGLLayer в качестве хранилища для буфера цвета.
Каждая отдельная вещь, которая связана с буфером кадров, например, хранилище для цветового буфера или хранилище для буфера глубины, называется буфером рендеринга. Вы можете попросить водителя построить его в любой области, которая ему нравится, без привязки к текстуре через glGenRenderbuffers
и glRenderbufferStorage
. Так, например, вы можете получить только цветовой буфер в текстуре и оставить графический процессор, если хотите, для хранения буфера глубины.