一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0到1.0之间的。但是如果我们遇上了一个特定的区域,其中有多个亮光源使这些数值总和超过了1.0,会导致场景混成一片,难以分辨。

显示器被限制为只能显示值为0.0到1.0间的颜色,但是在光照方程中却没有这个限制。通过使片段的颜色超过1.0,我们有了一个更大的颜色范围,这也被称作HDR(High Dynamic Range, 高动态范围)。有了HDR,亮的东西可以变得非常亮,暗的东西可以变得非常暗,而且充满细节。

HDR原本只是被运用在摄影上,摄影师对同一个场景采取不同曝光拍多张照片,捕捉大范围的色彩值。这些图片被合成为HDR图片,从而综合不同的曝光等级使得大范围的细节可见。看下面这个例子,左边这张图片在被光照亮的区域充满细节,但是在黑暗的区域就什么都看不见了;但是右边这张图的高曝光却可以让之前看不出来的黑暗区域显现出来。

HDR渲染和其很相似,我们允许用更大范围的颜色值渲染从而获取大范围的黑暗与明亮的场景细节,最后将所有HDR值转换成在[0.0, 1.0]范围的LDR(Low Dynamic Range,低动态范围)。转换HDR值到LDR值的过程叫做色调映射(Tone Mapping)

当一个帧缓冲的颜色缓冲的内部格式被设定成了GL_RGB16F, GL_RGBA16F, GL_RGB32F 或者GL_RGBA32F时,这些帧缓冲被叫做浮点帧缓冲(Floating Point Framebuffer),浮点帧缓冲可以存储超过0.0到1.0范围的浮点值,所以非常适合HDR渲染。

glBindTexture(GL_TEXTURE_2D, colorBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL);

最简单的色调映射算法是Reinhard色调映射,它涉及到分散整个HDR颜色值到LDR颜色值上,所有的值都有对应。Reinhard色调映射算法平均地将所有亮度值分散到LDR上。

uniform float exposure;void main()
{             const float gamma = 2.2;vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb;// 曝光色调映射// 白天使用低曝光,在夜间使用高曝光vec3 mapped = vec3(1.0) - exp(-hdrColor * exposure);// Gamma校正 mapped = pow(mapped, vec3(1.0 / gamma));color = vec4(mapped, 1.0);
}

OpenGL - HDR相关推荐

  1. OpenGL HDR色调映射的实例

    OpenGL HDR色调映射 先上图,再解答. 正常显示 按下M键 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示 按下M键 完整主要的源代码 #

  2. OpenGL HDR曝光的实例

    OpenGL HDR曝光 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <string> #include <vmath.h& ...

  3. OpenGL HDR渲染

    OpenGL HDR渲染 HDR渲染简介 浮点帧缓冲 色调映射 HDR渲染简介 一般来说,当存储在帧缓冲(Framebuffer)中时,亮度和颜色的值是默认被限制在0.0到1.0之间的.这个看起来无辜 ...

  4. OpenGL HDR高动态光照渲染的实例

    OpenGLHDR高动态光照渲染 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include < ...

  5. OpenGL完整教程专栏完整目录

    OpenGL完整教程专栏完整目录 专栏说明如下 专栏目录 专栏说明如下 内容:OpenGL完整教程 数量:314篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加上去的博文, ...

  6. [转]HDR渲染器的实现(基于OpenGL)

    http://dev.gameres.com/Program/Visual/3D/HDRTutorial/HDRTutorial.htm 作者:何咏(欢迎和大家交流,我的QQ:35574585,Ema ...

  7. OpenGL基础50:HDR

    一.HDR与LDR 由于显示器只能显示值为0.0到1.0间的颜色,因此当数据存储在帧缓冲(Framebuffer)中时,亮度和颜色的值也是默认被限制在0.0到1.0之间的,这个颜色范围即是LDR(Lo ...

  8. OpenGL(十八)Gamma校正 色域 与 HDR

    通常来说,在不同设备上看到的颜色是不同的.其中最常提及的概念是高动态光照渲染(High-Dynamic Range,简称 HDR ).它可以使图像在亮度的表现上更丰富.这篇文章讨论设备颜色和校正的相关 ...

  9. HDR in OpenGL

    HDR Framebuffer中的亮度和颜色值的范围被限制在0.0和1.0之间.我们在场景中设置光和颜色的时,也只能这个范围取值.这么做大部分情况下是OK的,结果也还可以,但是当场景中有一块多光源,亮 ...

最新文章

  1. windows下定时利用bat脚本实现ftp上传和下载
  2. 【吾日三省吾身】2015.6.03-涅槃行动第十六天
  3. 每个人都应有自己的作品
  4. 为什么MES系统要定制化?看这三家汽车供应商的苦恼
  5. nginx 和 php超时设置
  6. 耶鲁大学校长2018迎新演讲全文
  7. Atitit。Js调用后台语言 java c#  php swing android  swt的方法大总结
  8. 读《因果的真相》第三章摘抄笔记
  9. 手把手教你升级苹果ID为免费开发者帐号
  10. ASP.NET项目部署到阿里云服务器(IIS)
  11. onap桂林版部署教程
  12. debian使用FTP详细配置教程
  13. PCIe“拍了拍”PCI- PCI和PCIe发展历史
  14. 【JAVA案例】判断电话号码运营商
  15. 常用的java工具类
  16. 微信小程序----App生命周期
  17. 霍尔电流传感器在UPS蓄电池浮充电流远程监测方案的应用
  18. 中国剩余定理及扩展中国剩余定理
  19. DENSE_RANK() 函数的使用
  20. linux ssdb 安装 乱码,SSDB 命令行工具 ssdb-cli

热门文章

  1. Linux centos7设置禁Ping
  2. STM32+MAX6675利用SPI获取实时温度数据程序及代码
  3. 新型猪流感,人禽流感与普通流感的比较(视频)
  4. 猜动物游戏——机器学习和二叉树的应用
  5. 【Laravel系列7.4】安全相关
  6. Android之TextView设置autoLink属性后自定义跳转到指定界面
  7. 浅谈网站关键词选取的规则和注意事项
  8. error occurred at recursive SQL level 1错误
  9. 第一次取 Google 西联汇款的辛酸经历
  10. [附源码]Node.js计算机毕业设计个人资金账户管理Express