检索最终场景z缓冲区和颜色缓冲区

Retrieving final scene z-buffer and color buffer

本文关键字:缓冲区 颜色 检索      更新时间:2023-10-16

我正在开发opengl2.1和opengles 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);

现在任何东西都可以在这里渲染使用depthBuffer_或colorBuffer_作为OpengGL纹理句柄

使用framebuffer对象。它们是OpenGL-ES-2的一部分,并可作为OpenGL-2.1的扩展(得到良好支持)。

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

是在桌面OpenGL-2.x上使用扩展的最小工作示例