ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

noteForOpenGL HDR与色调映射:曝光度调节让渲染既不过曝也不死黑

noteForOpenGL HDR与色调映射:曝光度调节让渲染既不过曝也不死黑 noteForOpenGL HDR与色调映射曝光度调节让渲染既不过曝也不死黑【免费下载链接】noteForOpenGLOpenGL学习脚印配套代码项目地址: https://gitcode.com/gh_mirrors/no/noteForOpenGLnoteForOpenGL 是《OpenGL 学习脚印》一书的配套代码仓库其中advancedLighting/HDR-toneMapping目录完整演示了HDR 渲染与色调映射Tone Mapping先用高动态范围颜色存储场景再通过**曝光度调节exposure**把超出显示器范围的颜色压缩到可见区间让渲染画面既不过曝一片死白也不死黑细节全丢。本文带你用 3 个演示工程理解这套流程并掌握实时调节曝光度的实用技巧。为什么普通渲染会过曝或死黑普通渲染的颜色通道通常是 8 位每通道只能存 01 之间的值。但真实场景中强光比如正对镜头的灯光的亮度可能远超 1.0这些超出范围的颜色在写入帧缓冲时会被直接**裁剪clamp**成纯白周围的暗部则因为对比度被拉走而显得死黑、丢失细节。上图为未使用色调映射的画面中心光源被裁剪成一团刺眼的纯白走廊大部分区域漆黑一片。这就是过曝与死黑并存的典型问题。HDR 渲染两步走HDR 纹理 全屏后处理noteForOpenGL 的 HDR 演示采用了经典的两阶段方案实现见advancedLighting/HDR-toneMapping/HDR2/toneMapping.cpp第一步用 HDR 帧缓冲存储场景。把场景渲染到一张GL_RGB16F16 位浮点纹理上浮点格式可以保存大于 1.0 的颜色值强光信息不再被裁剪。场景着色器 scene.frag 用 4 个带衰减的点光源计算漫反射 Blinn-Phong 高光并把结果原样写入 HDR 纹理。第二步全屏四边形做后处理。再绘制一个覆盖全屏的四边形用 hdrAdjust.frag 把 HDR 纹理压回 01 的可显示范围这一步就是色调映射。3 种色调映射算法从简单映射到曝光度映射hdrAdjust.frag里给出了 3 种可直接切换的算法由简到难算法核心思路特点无色调映射直接输出 HDR 颜色高亮裁剪成纯白仅用于对比简单色调映射color / (color 1.0)再 Gamma 校正把任意亮度平滑压缩到 01曝光度映射1 - exp(-color * exposureFactor)再 Gamma 校正引入曝光系数可实时调节明暗 无论哪种算法最后一步都会做Gamma 校正pow(color, 1/2.2)把线性空间的结果转换回显示器使用的 sRGB 空间画面才不会发灰。曝光度调节实战上下键实时改变画面明暗最实用的演示在 HDR2 工程中程序响应键盘上/下方向键每次让exposureFactor步进 0.1并打印当前曝光值。三张截图直观展示了不同曝光度下同一个走廊场景的差别曝光度 0.5偏暗暗部细节丰富但高光偏弱曝光度 1.0默认值高光与暗部平衡曝光度 6.0明显提亮高光接近饱和但暗部细节全部找回可以看到曝光度调小画面偏暗、高光克制调大后暗部细节逐步浮现但高光逐渐逼近饱和。1 - exp(-color * exposure)这个曲线的妙处在于——无论曝光多高输出值都渐近地逼近 1 而不是突变为纯白画面过渡自然不会出现啪一下过曝的硬边。简单色调映射的对比效果如果不使用曝光度、直接套用color / (color 1.0)的简单映射画面整体偏暗且没有交互调节能力适合把它和曝光度映射上图 exposure1.0放在一起对比体会可调曝光带来的自由度。相关文件与延伸阅读HDR 第一步演示无色调映射advancedLighting/HDR-toneMapping/HDR1/toneMapping.cppHDR 第二步演示曝光度色调映射advancedLighting/HDR-toneMapping/HDR2/toneMapping.cpp场景光照着色器advancedLighting/HDR-toneMapping/HDR2/scene.frag后处理色调映射着色器advancedLighting/HDR-toneMapping/HDR2/hdrAdjust.frag小结HDR 渲染的本质是先超规格保存、再压缩显示。掌握1 - exp(-color * exposure)这条曝光映射曲线并学会用上下键实时调节 exposureFactor你的画面就能在不过曝、不死黑之间自由切换。跑完这个工程你也就拿到了实现游戏自动曝光手动曝光功能的完整模板。【免费下载链接】noteForOpenGLOpenGL学习脚印配套代码项目地址: https://gitcode.com/gh_mirrors/no/noteForOpenGL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表