离屏渲染FBO中使用depth信息
来源:互联网 发布:剑网三捏脸数据非法 编辑:程序博客网 时间:2024/06/08 12:01
在显示窗口中使用的framebuffer,opengl渲染管线会自动创建一个颜色渲染区(color),一个深度渲染缓冲区(depth)和一个模板渲染缓冲区(stencil),开启glEnable(GL_DEPTH_TEST)就可以了。然而在离屏渲染自己创建的framebuffer中,这几个需要手动创建。需要哪个创建哪个。
之前在基于ffmpeg中添加的离屏渲染filter中只绑定了GL_COLOR_ATTACHMENT0,然后发现draw的时候后画的会覆盖先画的内容。查了下,发现需要手动创建renderbuffer,初始化大小,并且绑定GL_DEPTH_ATTACHMENT,这样才能通过glEnable(GL_DEPTH_TEST)来开启深度。(如果不创建这个buffer绑定,那么仅仅开启GL_DEPTH_TEST毫无效果,不会有深度测试)
这里笔记一下我使用的framebuffer初始化过程,使用的是multisample texture用于抗锯齿,创建了3个fbo分别用于YUV,所以每一个的texture只用到RED
1. 创建3个texture,并初始化多采样次数为4
glGenTextures(3, tex_serial); for (int i=0; i<planes; i++) { glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex_serial[i]); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RED, width[i], height[i], GL_TRUE); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); }2. 创建3个renderbuffer
glGenRenderbuffers(3, fbo_depth); for (int i=0; i<s->planes; i++) { glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth[i]); glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT, width[i], height[i]); glBindRenderbuffer(GL_RENDERBUFFER, 0); }
3. 创建3个framebuffer,并且分别绑定对应的texture和renderbuffer
glGenFramebuffers(3, fbo_render); for (int i=0; i<s->planes; i++) { glBindFramebuffer(GL_FRAMEBUFFER, fbo_render[i]); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth[i]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex_serial[i], 0); status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { av_log(NULL, AV_LOG_ERROR, "Error code %x (in %s): Couldn't create frame buffer", status, __FUNCTION__); } glBindFramebuffer(GL_FRAMEBUFFER, 0); }
如果没有绑定depth buffer的话(也就是不做glFramebufferRenderbuffer),则深度信息在画图时没有体现,后画的会覆盖先画的,如下图:
如果绑定了depth并且开始了深度测试,则可以按我们预期的输出:
阅读全文
0 0
- 离屏渲染FBO中使用depth信息
- opengl使用FBO离屏渲染图片
- 使用fbo离屏渲染绘制图片
- FBO离屏渲染技术
- webgl——使用FBO实现离屏渲染
- OpenGL基于帧缓存FBO的离屏渲染
- opengl fbo离屏渲染,处理Android截屏卡顿太久。
- Android OpenGLES2.0(十二)——FBO离屏渲染
- Android OpenGLES2.0(十二)——FBO离屏渲染
- FBO 渲染到纹理
- FBO中如何使用模板缓冲区
- fbo实现离线渲染流程
- FBO and the FB's depth
- OpenGL FBO渲染到纹理实例
- Opengl中的FBO渲染到纹理
- openl FBO使用经验
- fbo
- FBO
- Swift项目中添加GPUImage
- 安装完oracle 11G启动oracle developer重复弹出指定jdk
- Struts2:stream和json类型的返回
- springmvc搭建
- 大端存储与小端存储
- 离屏渲染FBO中使用depth信息
- 虚拟机连接CentOS,CentOS安装Redis
- 简单几步为Atom配置LaTex插件支持数学公式
- socket编程(八)
- ORACLE rollup函数的使用(与group by一起使用)
- C++输出格式
- 点击多个按钮之间互不影响(自定义属性)
- JRTPLIB使用实例
- 修ITI.Transcendata.CADFIX.v11.SP1-ISO 1DVD