实时渲染:Tone Mapping 色调映射

詹令
lealzhan@126.com
2017.12.28

Tone Mapping 色调映射

  • 动态范围 dynamic range:图像的最明亮区域最暗区域的光亮度对比度。
  • 例如,阴暗处的亮度约为10~cd/m2,而太阳光直射下的区域亮度可达到10^5cd/m2,也就是此场景动态范围为10000:1
  • 一般CRT显示器的最大显示亮度约为100cd/m2, 即显示的动态范围约为100:1
  • 色调映射(Tone Mapping) 将高动态范围图像数据通过某种映射算子处理成低动态范围设备所能接受的动态范围内。
  • 色调映射 = Tone Mapping = 色调映射算子 = Tone Mapping Operator TMO

色调映射一般分为局部色调映射和全局色调映射。 全局色调映射只考虑像素自身的信息,而局部色调映射在进行映射时要考虑周边像素信息。

全局色调映射

全局色调映射由于不涉及到周边像素信息的计算,运算速度较快。一般在游戏中比较常用。常见的全局色调映射有以下几种。

//
// tone mapping: hdr(0~infinite) to ldr(0~1)
//

//http://filmicworlds.com/blog/filmic-tonemapping-operators/
vec3 Uncharted2Tonemap(vec3 x)
{
	float A = 0.15;
	float B = 0.50;
	float C = 0.10;
	float D = 0.20;
	float E = 0.02;
	float F = 0.30;
    return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
}

vec3 Uncharted2TonemapMain(vec3 texColor, float TonemapMaxWhite)
{
	vec3 color = Uncharted2Tonemap(texCOlor)/Uncharted2Tonemap(vec3(TonemapMaxWhite));
	return color;
}

vec3 ReinchardEq3Tonemap(vec3 x)
{
	return x / (1.0 + x);
}

vec3 ReinchardEq4Tonemap(vec3 x, float white)
{
	return x * (1.0 + x/white)/(1.0 + x);
}
//调用
vec3 tone_mapping(vec3 hdr_color, int mode = -1)
{
	
	vec3 mapped = vec3(0.0);	
	float TonemapMaxWhite = 1.8;
	float exposure = 3;

	if(mode==0) //Reinhard tone mapping
	{
		mapped = ReinchardEq3Tonemap(hdr_color*exposure);
	}
	else if(mode ==1)
	{
		mapped = ReinchardEq4Tonemap(hdr_color*exposure, TonemapMaxWhite);
	}
	else if(mode ==2) //Exposure tone mapping
	{
		mapped = vec3(1.0) - exp(-hdr_color*exposure);
	}
	else if(mode ==3) //Uncharted2Tonemap
	{
		mapped = Uncharted2TonemapMain(hdr_color*exposure, TonemapMaxWhite);
	}
	else if(mode==4) //only scale, no tone mapping
	{
		mapped = hdr_color*exposure;
	}
	else
	{
		mapped = hdr_color;
	}

	return mapped;
}

局部色调映射

基于分离压缩思想

基于分离压缩思想的色调映射有以下几个步骤

  1. 将HDR分离Decompose成Base Layer(HDR)和Detail Layer(LDR)

    • HDR的luminance(或其log)经过filter得到Base Layer
    • HDR的luminance (或其log)和Base Layer相减,得到Detail Layer
  2. 对Base Layer(HDR) 压缩成LDR,对Detail Layer (LDR)基本不压缩

  3. 然后再将处理后的两个Layer(都是LDR)合成最后的结果(LDR)。

以下示意图是对上述步骤的具体展示(来自Durand02的PPT)。

使用此算法应注意halo辉光现象。这是由于在decompose时使用了不保边的滤波器造成的。 参照了一些论文,基于这个思想的有以下几种常见算法:

Durand02

主要步骤如下

Reference

书籍

  • Reinhard E, Ward G, Pattanaik S, et al. High Dynamic Range Imaging - Acquisition, Display, and Image-Based Lighting (2. ed.).[M]// Political parties and the state :. Princeton University Press, 2010:2039 - 2042.

论文

  • Chiu K, Herf M, Shirley P, et al. Spatially Nonuniform Scaling Functions for High Contrast Images[C]// In Proceedings of Graphics Interface ’93. 1993:245–253.

  • Tumblin J, Turk G. LCIS:a boundary hierarchy for detail-preserving contrast reduction[C]// Conference on Computer Graphics & Interactive Techniques. 1999:83-90.

  • Durand F, Dorsey J. Fast bilateral filtering for the display of high-dynamicrange images[J]. Acm Transactions on Graphics, 2002, 21(3):257-266.

  • Farbman Z, Fattal R, Lischinski D. Edge-preserving decompositions for multi-scale tone and detail manipulation[C]// Acm Siggraph. ACM, 2008:1-10.

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值