HDR与Bloom

  • HDR
    • 浮点帧缓冲
      • 创建帧缓冲
      • 创建纹理
      • 创建深度缓冲
      • 检查
    • 色调映射(tone mapping)
      • Reinhard色调映射
      • 有曝光参数(Exposure)的色调映射
      • 自动曝光调整的色调映射(未写)
      • RendQuad函数
  • Bloom泛光
    • 提取亮色
      • MRT
    • 高斯模糊
    • 纹理混合

HDR

HDR(Hight Dynamic Range,高动态范围):
一般来讲,在我们的屏幕上显示的一个帧(Frame),在OPENGL中是以**帧缓冲(Framebuffer)**的形式存储的,默认情况下它的画面的亮度和颜色的值是被限制在0.0到1.0之间的一个值。
这导致倘若我们在着色器的使用过程中有超过的了1.0的亮度范围,(比如:我们正常使用的点光源亮度为1.0,若有多个点光源叠加照射在物体上,就有可能超过1.0,就会导致一部分片段的光照强度会被约束在1.0,造成画面失真。)

而我们需要做的就是代替系统,将当前的亮度合理的分配至0.0-1.0的屏幕亮度范围,即可使画面恢复正常的显示。

这个亮度分配通常会在片段着色器内进行。但是由于目前我们的渲染过程中,使用了很多个着色器。

如果我们只修改了一个着色器内的亮度分配,其他的着色器却没有更改,就会导致只有一部分的画面显示正常。

所以最懒的方式是将整个画面作为一个纹理导入一个专用的着色器中进行处理,再将画面输出。

那么如何将画面导出为一个纹理呢?
其实很简单,我们的屏幕的每一帧的画面的存储方式就是一个纹理,只不过它处理完成后直接被输出到屏幕上了。

那么我们只需要创建一个帧,这个帧拥有一个可以存储更大颜色范围的纹理,让最初的绘制不再绘制在屏幕上,而是绘制在这个帧的纹理上。

要进行画面亮度的重分配,首先我们需要将原本会显示在 默认帧(屏幕) 上的画面,用一个新的帧作为中间人存储,这个帧应该含有一个颜色范围更大的纹理。
随后将这个纹理,作为默认帧的输入,在绘制过程中调节纹理的亮度,并绘制在默认帧(屏幕) 上即可。
由于我们最后在默认帧上绘制时,只需要绘制一个整幅的经过亮度调节的图像,所以绘制一个带有该纹理的屏幕大小的四边形就可以。

我们预计将会得到如下的结果。

浮点帧缓冲

创建帧缓冲

我们之前一直都是在默认帧渲染,它的默认光照强度是0-1.0。

 glBindFramebuffer(GL_FRAMEBUFFER, 0);

我们需要创建一个新的帧,它的纹理应该可以存储那些大于1.0的浮点数据,也就是我们需要它的数据类型可以更大。

像其他创建opengl顶点数组或纹理一样,我们首先需要向系统获取一个可用的该类型的索引,这类索引通常为一个GLuint类型的值,所以我们新建一个GLuint类型的变量fbo(frame buffer object)

【opengl】HDR与Bloomw(未)相关推荐

  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

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

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

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

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

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

  7. iPhone开发基础教程笔记(十二)--第十二章 使用Quartz和OpenGL绘图

    第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图.一个库是Quartz 2D,她是Core Graphics框架的一部分:另一个库是OpenGL ES,她是跨平台的图形库. ...

  8. Using OpenGL in a SFML window

    系列文章 SFML-windows 篇 SFML-Events explained 篇 SFML-Keyboard, mouse and joystick 篇 SFML-Using OpenGL in ...

  9. 0也显示曲线 mpchart_BenQ 明基专业摄影显示器SW270C开箱评测体验

    前言继BenQ SW271显示器(评测链接)之后,BenQ又推出了专业影像工作者的高效利器-SW270C(官网链接),搭配27英寸2K分辨率IPS屏,覆盖99%AdobeRGB.100%sRGB\Re ...

最新文章

  1. 机器学习(15)精确率召回率F1-score(查看癌症预测结果的精确率、召回率)
  2. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入
  3. [转帖]linux下的X server:linux图形界面原理
  4. C#多线程学习(一) 多线程的相关概念
  5. python发红包实现
  6. (48)VHDL实现8位奇偶校验电路(process语句语句)
  7. server 2008 mysql 报错 0xc000007b_这十个MySQL经典错误,99%的程序员一定遇到过!你呢?...
  8. 微商团队长的五条管理心法
  9. python2和python3中encoding的差别
  10. 2. Spring Boot项目启动原理初探
  11. 如何理解冲突域和广播域?(转)
  12. [AV1] interpolation
  13. [Leetcode] 810. Chalkboard XOR Game 解题报告
  14. win10环境编译支持xp的libcurl+openssl踩过的坑
  15. 常用的几个测试网络连接的命令
  16. MATLAB-Simulink中BusCreator/Selector 和 Mux/Demux有什么区别?
  17. SSM学校社团管理系统
  18. 小游戏制作QQ宠物系列1 ---- 吹泡泡
  19. STM32F407 RTC 配置理解与总结
  20. sqlserver打开或创建mdf失败

热门文章

  1. System.ComponentModel.Win32Exception (0x80004005) 0x80004005
  2. 安卓app添加底电耗模式和待机模式白名单
  3. 【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)
  4. BMZCTF:哆啦A梦
  5. datacom-HCIP-831题库解析104题
  6. 用科技的力量加速创新,这家百年企业掌握了怎样的秘诀
  7. VB的CommonDialog控件的使用
  8. Android json解析有关内容学习笔记
  9. android 扫描二维码黑屏,android-zxing回来扫描界面出现黑屏的解决方案
  10. QT5.14.2自带Examples:Bars