基于物理的渲染—HDR Tone Mapping

news/2024/5/18 15:12:05 标签: 渲染, HDR, 游戏引擎, 论文

原文链接https://blog.uwa4d.com/archives/Study_HDRToneMapping.html

游戏引擎渲染管线中,我们对于R、G、B通道颜色信息的数值范围通常设置在[0,1]之间(或者是[0,255])。其中,0代表没有光亮度,1代表显示器能够显示的最大光亮度。这个表示方式虽然直接易懂,但它并不能反映真实世界中光亮度的情况。在真实世界的光照环境中,光亮强度有时候会超过显示器能够显示的最大亮度。而且,人眼在观察真实世界的物体时,会根据光照强度进行自我调节。因此,更加真实的渲染方式是让颜色值超过1。这种光照计算方式或环境光照图就是我们常常在游戏引擎中看到的HDR(High Dynamic Range)光照或者HDR环境贴图。但是,采用HDR渲染出来的亮度值会超过显示器能够显示最大值。此时,我们需要将光照结果从HDR转换为显示器能够正常显示的LDR。这一过程我们通常称之为Tone Mapping。下图是Unity引擎对采用HDR渲染的图片使用了Tone Mapping和没有使用Tone Mapping的对比结果:

HDRToneMapping/1.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />
其中,上图是没有使用Tone Mapping的结果,下图是使用了Tone Mapping的结果。可以看到,在没有使用Tone Mapping的渲染结果中,有很大一部分像素的光亮度是超过了显示器能够显示的最大值。在视觉上,这些地方变得过曝了。而在使用了Tone Mapping的渲染结果中,像素光亮度变得正常,视觉上也更加真实。

今天我们要介绍的这一篇论文是于2002年发表在Siggraph会议上的论文“Photographic Tone Reproduction for Digital Images”。这篇论文提出了一种新的Tone Mapping的方法,使得经过该方法转换的结果从视觉上看起来更加接近真实世界的物体。首先,我们来看看这篇论文的结果图,如下图所示:

HDRToneMapping/2.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />
其中,左图是采用线性缩放的结果,右图是采用论文中的算法进行转换的结果。可以看到,在简单的线性缩放结果中,许多细节部分丢失了;而论文算法转换的结果则很好地保留了图像的细节部分。接下来,我们将对论文中的算法部分做详细介绍。


一、初始光亮度映射

首先,文章作者对整个图像做了一个光亮度的映射,其作用类似于设置相机的曝光。这一操作实际就是对每一个像素做固定缩放。根据前人对Tone Mapping的研究结论,论文作者认为光亮度的log平均值能够反映图片中像素光亮度的特征。因此,作者用该值对每个像素作缩放。

若用Lω(x,y)表示像素(x,y)的光亮度,则log平均值可表示为:

HDRToneMapping/GS1.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,N 表示像素个数,δ 是一个用于避免奇异值的常数。缩放后的光亮度 L(x,y) 可用如下公式表示:

HDRToneMapping/GS2.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,α 是一个缩放参数,被称为Key Value,不同的 α 值对应了不同的缩放程度,如下图所示:

HDRToneMapping/3.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

但是,仅仅做简单线性缩放是不够的。对于光亮度变化不是很大的图片,这种方法可以将像素的光亮度很好地压缩到一定范围,但是对于大多数图片,绝大部分像素光亮度是在某一个范围之内,而少数高亮的像素比平均值高太多,很容易产生过曝,如:光源、高光反射等。因此,通常在经过线性缩放之后,还需要利用非线性的算子对图像进行处理。文中作者列举了一种常用的算子:
HDRToneMapping/GS3.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,Ld(x,y)表示经过非线性算子处理后的像素,Lwhite表示图片中被映射到白色亮度的像素中的最小值。由于是非线性的,对于亮度高的像素缩放更大,因此该公式能够防止线性缩放中无法处理的过曝情况。但是,这种简单的算子通常容易导致细节丢失。作者观察到,在传统打印技术中,为了提高打印结果的质量,通常会采用一种dodying-and-burning的方法。该方法的原理是根据打印内容的不同,在不同区域减少光亮度(dodying)或者增加光亮度(burning)。论文作者通过实验,对比了简单非线性映射以及dodying-and-burning处理后的结果,如下图所示:
HDRToneMapping/4.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,上排图片中太阳被树枝遮挡住,因此不包含高亮的区域,下面的图片则包含高光反射。左边一列图片同样是采用简单非线性算子(Simple Operator)缩放,经过观察可以发现,下图中的书中文字完全被高光覆盖。由此可见,简单的非线性算子缩放会丢失很多细节。

论文作者在经过观察和测试之后,基于dodging-and-burning方法,提出了一种自适应的dodging-and-burning方法,下面我们将详细说明。


二、自适应dodging-and-burning

自适应dodging-and-burning的特点是,找出对比度大的边缘包围的区域,然后对该区域进行处理。因此,作者提出利用高斯核卷积的方法来找出这些区域。对于不同的缩放系数 s,在不同的像素点(x,y),计算高斯核函数 Ri(x,y,s)与图像 L(x,y)的卷积。则卷积结果 Vi(x,y,s)可表示为:

HDRToneMapping/GS4.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,Ri(x,y,s)可表示为:

HDRToneMapping/GS5.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

然后,论文作者定义了一个误差函数,计算不同 αi 参数的卷积结果之差,来衡量图像局部像素的光亮度分布。则误差函数 V 可以表示为:

HDRToneMapping/GS6.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

通过对不同的缩放参数 s 进行计算,找出符合如下公式的参数:

HDRToneMapping/GS7.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,ϵ 是一个阈值,sm 是对每个像素计算出的缩放参数。当我们获得每一个像素的缩放参数后,对每一个像素进行不同的缩放计算:

HDRToneMapping/GS8.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

从而获得最终的Tone Mapping结果。下图显示了计算过程:
HDRToneMapping/5.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />

其中,左图显示了计算缩放参数的过程,Center表示内圈高斯计算的范围,Surround表示外圈高斯计算的范围。右图显示了用不同缩放参数进行缩放后的结果。通过观察可以发下,当缩放太小时无法有效地提取出图像细节,而缩放太大时会出现黑色的Artifacts。


三、实验对比

论文作者将dodging-and-burning计算结果与前人的结果进行了对比实验。如下图所示:
HDRToneMapping/6.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />
HDRToneMapping/7.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />
HDRToneMapping/8.png" alt="请输入图片描述" style="margin:0px; padding:0px; outline:0px; border:0px; vertical-align:baseline; height:auto; max-width:100%; background:transparent" />
其中,New operator表示了论文的实现结果。


四、总结

论文作者提出了一种新的Tone Mapping的算法,它通过对dodging-and-burning打印技术的观察和分析,对于不同的区域采用不同的缩放系数,提出了自适应dodging-and-burning的方法,能够将高动态图转换成低动态图时防止高亮部分过曝,并且能达到在亮部和暗部都能保持细节的目的。


五、论文信息

作者信息:
Erik Reinhard,著名计算机图形学学者,目前在Technicolor Research and Innovation做研究工作;
Michael Stark,计算机图形学研究者,曾就读于美国犹他大学;
Peter Shirley,著名计算机图形学大牛,真实感渲染专家,犹他大学客座教授,NVidia首席科学家;
James Ferwerda,著名计算机图形学学者,罗彻斯特理工学院副教授。

论文链接:
http://www.cmap.polytechnique.fr/~peyre/cours/x2005signal/hdr_photographic.pdf

这是侑虎科技第225篇原创文章,欢迎转发分享,未经作者授权请勿转载。如果您也有任何独到的见解或者全新的发现也欢迎联系我们,一起探讨。(QQ群465082844)


关于惟学无际

【惟学无际】是UWA在2017年推出的全新研究型专栏,我们将为大家推荐极具实际价值的学术论文,并梳理其中的研究背景、实现原理和执行方法等。内容专注于游戏、VR和AR相关的计算机图形学领域。正所谓问渠哪得清如许,为有源头活水来 ,希望大家在研发的过程中不仅知其然,还能知其所以然。



http://www.niftyadmin.cn/n/1032104.html

相关文章

UWA 两周年庆活动第一弹!四场技术直播领跑六月充电季!

原文链接:https://blog.uwa4d.com/archives/1827.html UWA即将迎来两周岁生日啦,为答谢所有关注者的支持,UWA两周年庆系列活动第一弹即将亮相:四场精彩技术直播领跑充电季!UWA工程师将从Unity引擎的加载、内存、渲染、…

MySQL安装以及客户端的使用

MySQL安装以及客户端的使用 1.MySQL安装 配置yum源 [rootmaster ~]# wget -O /usr/src/mysql57-community-release-el7-10.noarch.rpm \ > http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm --2021-08-23 05:19:18-- http://dev.mysql.com/get/my…

VR交互动画短片《拾梦老人》的开发经历

原文链接:https://blog.uwa4d.com/archives/Sparkle_VRFilm_Experience.html 这是侑虎科技第226篇原创文章,感谢作者张言丰(资深TA,QQ:306566807)供稿。当然,如果您有任何独到的见解或者发现也欢…

UWA GOT 上线 | 原来本地化性能测评也可以So Easy!

原文链接:https://blog.uwa4d.com/archives/Introduction_UWAGOT.html 为了让研发团队更方便地在本地进行测试,UWA今天推出了这套工具:Game Optimization Toolkit(简称:UWA GOT),它既能方便研发…

MySQL数据备份与恢复及sql语句用法

1.Mysqldump简介 mysqldump是逻辑备份工具,支持MyISAM和InnoDB引擎。数据库运行时,MyISAM引擎只支持温备,InnoDB支持热备和温备。 2.MySQLdump的应用 2.1全量备份与恢复 全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷…

动画重定向技术分析及其在Unity中的应用

原文链接:https://blog.uwa4d.com/archives/AnimationRetargeting.html 这是侑虎科技第228篇原创文章,感谢作者贾伟昊供稿,欢迎转发分享,未经作者授权请勿转载。当然,如果您有任何独到的见解或者发现也欢迎联系我们&am…

多实例部署、开机自启、xtrabackup备份与恢复

多实例部署、开机自启、xtrabackup备份与恢复 一、MySQL多实例部署 1.下载二进制包 wget http://https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz[rootlocalhost ~]# ls anaconda-ks.cfg mysql-5.7.35-linux-glibc2.12-x86_64.…

用好Lua+Unity,让性能飞起来—LuaJIT性能坑详解

原文链接:https://blog.uwa4d.com/archives/usparkle_luajit.html 导语:大家都知道LuaJIT比原生Lua快,快在JIT这三个字上。但实际情况是,LuaJIT的行为十分复杂。尤其JIT并不是一个简单的把代码翻译成机器码的机制,背后…