Получение финального z-буфера сцены и цветового буфера

Я работаю над OpenGL 2.1 и OpenGL ES 2.0. Я хочу реализовать эффект глубины резкости для всей сцены. Я знаю, как сделать это для одной модели с шейдером, но для этого потребуется, чтобы все модели имели шейдер с одинаковым кодом. Есть ли способ получить окончательную глубину сцены и цветовой буфер и сохранить их в текстурах, чтобы я мог снова использовать их с DOF-шейдером? Или это плохая идея?

[РЕДАКТИРОВАТЬ] Наконец-то все заработало.
Код инициализации выглядит так:

glGenFramebuffers(1, &frameBuffer_);
glGenTextures(1, &colorBuffer_);
glGenTextures(1, &depthBuffer_);
//glGenRenderbuffers(1, &depthBuffer_);

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer_);

glBindTexture(GL_TEXTURE_2D, colorBuffer_);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RGBA,
width,
height,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
NULL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(
GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, colorBuffer_, 0);

glBindTexture(GL_TEXTURE_2D, depthBuffer_);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_DEPTH24_STENCIL8,
width,
height,
0,
GL_DEPTH_STENCIL,
GL_UNSIGNED_INT_24_8,
NULL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(
GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_TEXTURE_2D, depthBuffer_, 0);

//glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer_);
//glRenderbufferStorage(
//  GL_RENDERBUFFER,
//  GL_DEPTH_COMPONENT24,
//  width,
//  height);
//glFramebufferRenderbuffer(
//  GL_FRAMEBUFFER,
//  GL_DEPTH_ATTACHMENT,
//  GL_RENDERBUFFER, depthBuffer_);

GLenum status;
status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
switch(status) {
case GL_FRAMEBUFFER_COMPLETE:
// Success.
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
LOGE("Frame buffer format not supported.");
break;
default:
LOGE("Framebuffer Error.");
}

А потом при рендеринге первый вызов:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer_);

Рендеринг сцены, затем вызов:

glBindFramebuffer(GL_FRAMEBUFFER, 0);

И теперь все может быть отображено здесь с использованием глубиныBuffer_ или colorBuffer_ в качестве маркеров текстуры OpengGL.

1

Решение

Используйте объект кадрового буфера. Они являются частью OpenGL-ES-2 и доступны как (хорошо поддерживаемые) расширения для OpenGL-2.1.

Увидеть

https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo

для минимального рабочего примера использования расширений на рабочем столе OpenGL-2.x

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]