TA百人计划 图形 2.7 LDR与HDR
新工作。工作时间↑↑↑、更新频率↓↓↓。没想到新工作还跟现在学的这东西扯上点关系,后面作业就尽量用OpenGL写了。
笔记
- HDR = High Dynamic Range
- LDR = Low Dynamic Range
- 动态范围 = 最高亮度 / 最低亮度
LDR
色彩范围在0-1之间,使用8位(0-255)存储
HDR
HDR色彩范围可以突破1。使用更多存储空间(OpenGL中定义了GL_RGB16F, GL_RGBA16F, GL_RGB32F不同精度)。
常用hdr、tif、exr、raw存储。
hdr存储格式:常规的8位精度RGB通道(0-1范围)+alpha通道存储指数信息。精度不如所有通道用高精度存储来得好,但是节省空间。
为什么需要HDR
- 使用更高的精度描述色彩信息,能够超过1.0的色彩范围,用来描述高亮度部分,进行物理计算时更加真实。
- 超过1.0的部分运用bloom效果,提高画面品质。
获取HDR资源
http://www.hdrlabs.com/sibl/archive.html
https://www.openfootage.net/hdri-panorama/
Unity中的HDR
Camera-HDR设置
开启Camera
中的Allow HDR
- 场景将渲染为 HDR 图像缓冲区
- 屏幕后处理:Bloom & Tonemapping
- 完成转化:HDR -> LDR
- LDR图像发送给显示器
Lightmap HDR设置
Project Settings
中Player
的Lightmap Encoding
选为High Quality
- 选择 High Quality 将启用 HDR 光照贴图支持,而 Normal Quality 将切换为使用 RGBM 编码。
- GBM 编码:将颜色存储在 RGB 通道中,将乘数 (M) 存储在 Alpha 通道中
拾色器 HDR设置
shader中Properties
块拾色器前添加[HDR]
....
Properties
{
[HDR]_BackColor("BackColor", Color) = (1,1,1,1)
....
}
- 使用 Intensity 滑动条可以调整颜色的强度
- 滑动条每增加1,则提供的光量增加一倍
- 使用 Intensity 滑动条下的曝光样本可以看到当前颜色值在任一方向的预览效果
HDR优缺点
优点
- 画面中亮度超过1的部分不会被截为1,增加白色部分的细节并且减少曝光,
- 更好地支持Bloom效果
- 减少画面较暗部分的色阶感
缺点
- 渲染速度较慢,需要更多显存
- 不支持硬件抗锯齿
- 部分手机不支持
HDR与bloom
相关内容:LearnOpengl bloom
- 截取画面中超过一定阈值的部分
- 对这部分进行模糊处理(一般为高斯模糊)
- 原图和模糊后的图片进行叠加
HDR与Tone mapping(色调映射)
- 将HDR颜色映射回LDR颜色空间
- 一般不使用线性映射,效果差。 参考:Tone mapping进化论
ACES
美国电影艺术与科学学会
发明的。完全体:Academy Color Encoding System(ACES)
tone mapping只是其中的一部分
目前效果最好的tone mapping算法
float3 ACESToneMapping(float3 color, float adapted_lum)
{
const float A = 2.51f;
const float B = 0.03f;
const float C = 2.43f;
const float D = 0.59f;
const float E = 0.14f;
color *= adapted_lum;
return (color * (A * color + B)) / (color * (C * color + D) + E);
}
Reinhard
效果较为灰暗
float3 ReinhardToneMapping(float3 color, float adapted_lum)
{
const float MIDDLE_GREY = 1;
color *= MIDDLE_GREY / adapted_lum;
return color / (1.0f + color);
}
CE
CryEngine 2
使用的tone mapping方法。色彩鲜艳,对比度高。
float3 CEToneMapping(float3 color, float adapted_lum)
{
return 1 - exp(-adapted_lum * color);
}
Filmic
神秘海域2用的tone mapping
曲线拟合到人工调整的效果。效果不错,但计算量大。
float3 F(float3 x)
{
const float A = 0.22f;
const float B = 0.30f;
const float C = 0.10f;
const float D = 0.20f;
const float E = 0.01f;
const float F = 0.30f;
return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;
}
float3 Uncharted2ToneMapping(float3 color, float adapted_lum)
{
const float WHITE = 11.2f;
return F(1.6f * adapted_lum * color) / F(WHITE);
}
LUT
look up table。常用于后期调色滤镜。
原理为,把颜色RGB值作为纹理坐标对lut进行采样获得新的颜色。
制作方法:ps中对画面进行调整,然后把想用的调整过程应用到基准图中,调整后的基准图就是需要的lut图。
作业
试试IBL在HDR和LDR的区别
在LearnOpenGL的IBL示例上进行修改
第一张为HDR效果、第二张为LDR效果。使用的Reinhard
的tone mapping方式。
从对比结果上来看,LDR的小球反射纹理相较于HDR可以明显看到细节较少,特别是小球中间区域白色部分和反射的窗外风景。亮部颜色缺失不自然。