检索最终场景z缓冲区和颜色缓冲区
Retrieving final scene z-buffer and color buffer
我正在开发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上使用扩展的最小工作示例
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何在24位SDL_Surface上设置像素的颜色
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 从OpenGL应用程序中提取颜色/深度缓冲区
- 在缓冲区/数组中使用颜色结构
- OpenGL:正在读取颜色缓冲区
- 复制颜色和depthstencil缓冲区以备日后使用
- 如何在顶点缓冲区中以另一种颜色绘制顶点
- 检索最终场景z缓冲区和颜色缓冲区