OpenGL的帧缓冲对象和浮点纹理

本文介绍了如何在OpenGL中处理浮点纹理,以及使用帧缓冲对象(FBO)实现渲染到纹理(RTT)的过程。通过示例代码展示了如何创建浮点纹理,避免数据截断,并利用FBO将场景渲染到浮点格式纹理中,为后期处理如HDR、Tone Mapping和Bloom等操作做准备。同时,文章提到了GL_ARB_texture_float扩展对于支持浮点纹理的重要性。
摘要由CSDN通过智能技术生成



接下来准备实现光照贴图的打包和预计算了。因为想实现HDR,光照贴图准备存储为 RGBE或浮点格式。为了渲染浮点格式的光照贴图,就需要解决两个问题,一是如何让OpenGL能够真正地处理浮点格式的纹理,而不是把他们截断到 [0,1]区间内;二是如何将场景渲染到浮点格式的纹理中,以便对这个纹理进行Tone mapping 和Bloom等操作。

今天花了一晚上的时间在网上搜索资料,学习了Frame Buffer Object的用法。FBO是目前实现RTT和GPGPU算法最好的解决方案,因为它的接口设计相对合理,避免了显存到内存之间的数据交换。

FBO相当于各类帧缓冲,是一个渲染对象。在传统的渲染管线中,渲染后的数据输出到各种帧缓冲中,如颜色缓冲,深度缓冲等。有了FBO之后,就可以把数据渲染到已粘附到FBO的纹理中。稍后将会给出具体的代码,结合代码和分析你将很容易掌握FBO的用法。

现在先讨论一下OpenGL的浮点纹理。我们先来看一下OpenGL的glTexImage2D函数原型。

void glTexImage2D(

       GLenum target,
      GLint level,
      GLint internalformat,
      GLsizei width,
      GLsizei height,
      GLint border,
      GLenum format,
      GLenum type,
      const GLvoid *pixels
    );

 

以前,我们向纹理对象提供数据时是这样做的:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixels);

我们为Type参数提供的值是GL_UNSIGNED_BYTE表示我们的数据在内存中的存储格式为无符号字节型整数。现在我们的纹理格式为浮点型,我们会很自然地想到,能不能把上述函数调用改为:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_FLOAT,pixels);

来让OpenGL接收浮点纹理呢?答案是不可以。使用GL_FLOAT调用该函数后,glTexImage确实能够接

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值