新工作。工作时间↑↑↑、更新频率↓↓↓。没想到新工作还跟现在学的这东西扯上点关系,后面作业就尽量用OpenGL写了。

地址:【技术美术百人计划】图形 2.7 LDR与HDR

笔记

  • 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. 使用更高的精度描述色彩信息,能够超过1.0的色彩范围,用来描述高亮度部分,进行物理计算时更加真实。
  2. 超过1.0的部分运用bloom效果,提高画面品质。

获取HDR资源

http://www.hdrlabs.com/sibl/archive.html
https://www.openfootage.net/hdri-panorama/

Unity中的HDR

Camera-HDR设置

开启Camera中的Allow HDR

  1. 场景将渲染为 HDR 图像缓冲区
  2. 屏幕后处理:Bloom & Tonemapping
  3. 完成转化:HDR -> LDR
  4. LDR图像发送给显示器

Lightmap HDR设置

Project SettingsPlayerLightmap Encoding选为High Quality

  1. 选择 High Quality 将启用 HDR 光照贴图支持,而 Normal Quality 将切换为使用 RGBM 编码。
  2. GBM 编码:将颜色存储在 RGB 通道中,将乘数 (M) 存储在 Alpha 通道中

拾色器 HDR设置

shader中Properties块拾色器前添加[HDR]

....
Properties
{
  [HDR]_BackColor("BackColor", Color) = (1,1,1,1)
  ....
}
  1. 使用 Intensity 滑动条可以调整颜色的强度
  2. 滑动条每增加1,则提供的光量增加一倍
  3. 使用 Intensity 滑动条下的曝光样本可以看到当前颜色值在任一方向的预览效果

HDR优缺点

优点

  1. 画面中亮度超过1的部分不会被截为1,增加白色部分的细节并且减少曝光,
  2. 更好地支持Bloom效果
  3. 减少画面较暗部分的色阶感

缺点

  1. 渲染速度较慢,需要更多显存
  2. 不支持硬件抗锯齿
  3. 部分手机不支持

HDR与bloom

相关内容:LearnOpengl bloom

  1. 截取画面中超过一定阈值的部分
  2. 对这部分进行模糊处理(一般为高斯模糊)
  3. 原图和模糊后的图片进行叠加

HDR与Tone mapping(色调映射)

  • 将HDR颜色映射回LDR颜色空间
  • 一般不使用线性映射,效果差。 参考:Tone mapping进化论

ACES

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

Reinhard
效果较为灰暗

float3 ReinhardToneMapping(float3 color, float adapted_lum) 
{
    const float MIDDLE_GREY = 1;
    color *= MIDDLE_GREY / adapted_lum;
    return color / (1.0f + color);
}

CE

ce CryEngine 2使用的tone mapping方法。色彩鲜艳,对比度高。

float3 CEToneMapping(float3 color, float adapted_lum) 
{
    return 1 - exp(-adapted_lum * color);
}

Filmic

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 第一张为HDR效果、第二张为LDR效果。使用的Reinhard的tone mapping方式。
从对比结果上来看,LDR的小球反射纹理相较于HDR可以明显看到细节较少,特别是小球中间区域白色部分和反射的窗外风景。亮部颜色缺失不自然。