UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - 惟学无际
type: channel
link: https://blog.uwa4d.com/tag/惟学无际
items: 基于物理的渲染—HDR Tone Mapping
items: 基于物理的渲染－用真实的环境光照亮物体
items: 基于物理的渲染—基于Haar小波基的实时全局光照明
items: 基于物理的渲染—更精确的微表面分布函数GGX
items: 微表面模型－PBR渲染管线的材质
items: 基于物理的渲染—迪士尼的渲染模型
items: 基于功耗预算的实时绘制

基于物理的渲染—HDR Tone Mapping
type: item
date: 2017-04-07T06:09:00+03:00
description: 在游戏引擎渲染管线中，我们对于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的对比结果： 其中，上图是没有使用Tone Mapping的结果，下图是使用了Tone Mapping的结果。可以看到，在没有使用Tone Mapping的渲染结果中，有很大一部分像素的光亮度是超过了显示器能够显示的最大值。在视觉上，这些地方变得过曝了。而在使用了Tone Mapping的渲染结果中，像素光亮度变得正常，视觉上也更加真实。 今天我们要介绍的这一篇论文是于2002年发表在Siggraph会议上的论文“Photographic Tone Reproduction for Digital Images”。这篇论文提出了一种新的Tone Mapping的方法，使得经过该方法转换的结果从视觉上看起来更加接近真实世界的物体。首先，我们来看看这篇论文的结果图，如下图所示： 其中，左图是采用线性缩放的结果，右图是采用论文中的算法进行转换的结果。可以看到，在简单的线性缩放结果中，许多细节部分丢失了；而论文算法转换的结果则很好地保留了图像的细节部分。接下来，我们将对论文中的算法部分做详细介绍。 一、初始光亮度映射 首先，文章作者对整个图像做了一个光亮度的映射，其作用类似于设置相机的曝光。这一操作实际就是对每一个像素做固定缩放。根据前人对Tone Mapping的研究结论，论文作者认为光亮度的log平均值能够反映图片中像素光亮度的特征。因此，作者用该值对每个像素作缩放。 若用Lω（x，y）表示像素（x，y）的光亮度，则log平均值可表示为： 其中，N 表示像素个数，δ 是一个用于避免奇异值的常数。缩放后的光亮度 L(x，y) 可用如下公式表示： 其中，α 是一个缩放参数，被称为Key Value，不同的 α 值对应了不同的缩放程度，如下图所示： 但是，仅仅做简单线性缩放是不够的。对于光亮度变化不是很大的图片，这种方法可以将像素的光亮度很好地压缩到一定范围，但是对于大多数图片，绝大部分像素光亮度是在某一个范围之内，而少数高亮的像素比平均值高太多，很容易产生过曝，如：光源、高光反射等。因此，通常在经过线性缩放之后，还需要利用非线性的算子对图像进行处理。文中作者列举了一种常用的算子： 其中，Ld（x，y）表示经过非线性算子处理后的像素，Lwhite表示图片中被映射到白色亮度的像素中的最小值。由于是非线性的，对于亮度高的像素缩放更大，因此该公式能够防止线性缩放中无法处理的过曝情况。但是，这种简单的算子通常容易导致细节丢失。作者观察到，在传统打印技术中，为了提高打印结果的质量，通常会采用一种dodying-and-burning的方法。该方法的原理是根据打印内容的不同，在不同区域减少光亮度（dodying）或者增加光亮度（burning）。论文作者通过实验，对比了简单非线性映射以及dodying-and-burning处理后的结果，如下图所示： 其中，上排图片中太阳被树枝遮挡住，因此不包含高亮的区域，下面的图片则包含高光反射。左边一列图片同样是采用简单非线性算子（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）可表示为： 其中，Ri（x，y，s）可表示为：…

基于物理的渲染－用真实的环境光照亮物体
type: item
date: 2017-03-30T09:44:00+03:00
description: 目前，在游戏引擎中用于照亮物体的光源非常丰富。其中，比较常用的有：平行方向光、点光源、聚光灯以及体积光等，但它们都是对真实光源的近似，并不能很好地模拟真实世界中的复杂光照情况。为了增加光照效果的真实感，我们常用的一种光照计算方法是基于图像的光照计算（Image-based Lighting）。例如：天空盒（Sky Box）作为环境光贴图，或者是用Reflection Probe作为反射贴图等。而在最近比较流行的基于物理的渲染管线（Physically-based Rendering）中，IBL成为了必不可少的一部分。 今天我们介绍的一篇论文是Paul Debevec在1998年Siggraph会议上发表的一篇文章。这篇论文主要解决的问题是：如何利用HDR（High Dynamic Range）图以及全局光照明技术，将虚拟的物体融合到真实照片中。它实现的效果类似于今天我们常说的AR（Augmented Reality）技术。在渲染虚拟物体的时候，文章作者采用的方法是用HDR图作为环境光贴图来计算光照结果。该方法是最早使用IBL进行光照计算的方法之一。我们先来看看他的渲染结果，如下图所示。 其中，左图是真实拍摄的图片，右边是将虚拟物体合成到真实拍摄图片的结果。可以看到，虚拟物体中的金属材质对周围环境的反射以及高光，都能和真实物体形成一致的光照结果。 论文将场景中的物体分成三类分别进行处理。下图是这篇论文的算法框架图。 这三类分别是：远处的场景、近处的局部场景、以及虚拟场景。在渲染远处场景的时候，论文作者用真实拍摄的图片以及简单的几何来渲染，其光照信息全部来自拍摄的图像。在渲染近处局部场景的时候，由于需要模拟真实场景对虚拟场景的影响，所以论文作者还对物体的材质进行了近似估计。最后，在渲染虚拟物体的时候，利用环境光照的入射光来计算光照。其算法过程示意图如下图所示。 首先，论文作者对真实场景进行拍摄。然后，利用反射探针对场景中的环境光进行获取。在获取环境光贴图时，作者采用的是HDR的表示方式。接着，利用获取的环境光照贴图对远处场景进行建模。最后，用全局光照软件渲染虚拟物体以及与虚拟物体有光照影响的近处局部物体，并融合到拍摄的真实图像中。接下来我们将对论文的算法进行详细介绍。 一、用真实的环境光照亮物体 文章作者采用了HDR图作为环境光照贴图。为了说明用HDR图比普通的LDR图更能表现实际光照环境，论文作者分别采用HDR和LDR环境贴图进行渲染，并对两者结果进行了比较，结果如下图所示。 第一排是用HDR图片渲染的结果，第二排是用LDR渲染结果。其中，右边三列结果中，LDR的渲染结果在计算时，作者将光照强度增大了6倍，从而使得LDR的入射光的强度能够与HDR的一致。但是从渲染结果中可以看到，采用HDR环境光图渲染的结果能够表现出更多的细节，而LDR的渲染结果显得比较平坦。因此，作者在其接下来的实验中全部采用了HDR图片作为环境光照入射光。 二、无限远场景 文章作者提出了一种基于光照的建模方法（Light Based Model）来对远处的物体进行建模。这种方法其实类似于我们今天常用的天空盒。它的做法是将HDR光照图映射到一个方盒上，作为远处的背景，如下图所示。 这张图不仅用于显示无限远处的场景，并且用于对虚拟物体渲染的入射光。 三、近处局部场景 为了模拟近处局部真实场景与虚拟场景之间的光照交互，不仅需要对近处局部场景进行几何建模，而且需要获取其材质信息。虽然可以采用材质获取工具对真实场景材质进行测量，但是文章作者采用了迭代的方法来对其进行估计。该方法的过程如下： 首先对局部真实场景的几何进行建模，然后对其材质进行估计，如：diffuse，diffuse加specular，或者是任意的BRDF模型，甚至是随空间变化的; 对估计的材质模型选择初始参数; 用全局光照算法对局部场景进行渲染; 采用不同的视角，比较渲染结果和真实拍摄结果; 如果渲染结果与真实拍摄结果不一致，则调整模型参数，并返回第3步继续迭代。 四、近处的虚拟场景 在渲染近处的虚拟场景时，需要将拍摄的多张环境光贴图合成一张完整的贴图作为入射环境光。因为，当采用Light Probe采集环境光照时，处于Probe球背面的场景无法被采集到。同时，正对着相机方向的场景由于球面边缘反射的拉伸，采样率低，容易出现瑕疵。因此，论文作者在多个不同的角度对Probe球进行拍摄，然后将多张拍摄的结果进行合成，最后形成一张完整的贴图。下图展示了论文作者采集的三张环境光贴图以及对虚拟场景的渲染结果。 在上方的图片中，上图是利用Light Probe拍摄的三张贴图，下图是用合成的环境光贴图渲染的虚拟场景。在渲染时，论文作者采用了全局光照渲染引擎Radiance进行全局光照渲染。与我们目前在游戏引擎中采用的实…

基于物理的渲染—基于Haar小波基的实时全局光照明
type: item
date: 2017-03-16T04:06:00+02:00
description: 上一期惟学无际我们给大家介绍了一篇 基于球面调和基函数（Spherical Hamonices，简称 SH ）的动态全局光照明算法。它的思路是：将光线在物体间复杂的传输过程看作一个传输函数，预先模拟计算好并用 SH 基函数来近似表示。同时，在实时光照计算时，将入射的环境光用 SH 基函数近似，这样光照渲染结果可以用两者的 SH 基函数的点积进行计算。该算法通过预计算模拟，使得实时计算的复杂度大大降低，从而能够支持实时动态光源的全局光照明渲染。但是，该算法有一个缺陷，即只能获得低频的渲染效果。因此，基于 SH 的 PRT 只能渲染类似于 AO（Ambient Occlusion）的软阴影，无法渲染有明显轮廓边界的真实阴影。 今天介绍的这篇文章是 Ren Ng 等人在2003年发表于 Siggraph 会议上的经典论文 《All-Frequency Shadows Using Non-linear Wavelet LightingApproximation》，目前该篇文章的引用次数已经超过400次。在这篇论文中，作者提出了一个采用非线性小波变换来代替线性 SH 变换的 PRT 算法。实验结果证明，相较于前人的 SH 函数，本文作者在使用相同数量的小波函数时，能够更好地捕捉到全局光照明的高频信息。因此，该算法能够渲染出更加真实的全局光照明效果，比如具有明显边缘的实时阴影。 首先我们来看看这篇论文的效果图，如上图所示。其中，左图是基于 SH 的 PRT 渲染结果，右边是基于小波的 PRT 渲染结果。两幅图采用了相同数量的基函数项：左图采用100个 SH 基函数，右图采用100个小波基函数。中间的六个方形纹理则是环境光贴图。比较左右两图的阴影渲染效果则可以发现，右图的阴影边缘较为清晰，而左图的比较模糊。因此，在使用相同数量基函数的情况下，小波变换比 SH 变换能够捕捉到更高频的光照信息，渲染结果更加贴近真实情况。接下来，我们将详细介绍这篇论文算法的主要内容。 一、算法与实现 所有的渲染问题，其实都是在解决渲染方程的计算问题。这篇论文也不例外，因此我们首先来介绍渲染方程。考虑物体表面某一点 x，其法线方向为 n，则该点从 ωo 方向反射出的光 P( x, ωo ) 可表示为： 其中，L 为入射光强，V 为可见性函数，fr 为BRDF函数，n 为法线方向，ω 为入射光方向。 论文算法可以应用于两种情况：1）视点变化，材质限定为Diffuse；2）视点不变，材质任意。接下来我们分别介绍这两种情况下的解决方案。 1.1 视点可变且材质限定为Diffuse 当材质限定为Diffuse时，传输函数可以表示成为： 1.2 视点不变且材质任意 当材质为任意时，传输函数可表示成为： 其中，由于视点固定，所以 ωo 只跟 x 相关。 渲染方程中的积分式可以看成入射光强 L 与其他项关于入射光方向 ω 的卷积。离散化后就变成对应项相乘之后求和。于是，对于每一点 xi ，其光照计算可表示成为： 如果用矩阵以及向量形式表示，则可简化为：P= T · L 。其示意图如下图所示。 1.3 预计算 在预计算阶段，论文作者采用了两种方法。第一种方法是每次对传输矩阵 T 的一列进行模拟计算，也就是对入射光向量 L 的每一个方向 ω 做计算，计算方式是光线跟踪。因此，T 中每一列向量表示的是环境光贴图每一个像素照射场景的结果。该方法比较简单，并且支持各种全局光照效果，但是它只支持固定视点的情况。 第二种方法是每次对传输矩阵T 的一行进行模拟计算。这种方法只计算直接光照的部分。因此，传输矩阵的每一行表示的是物体表面某一点 x 的可见性立方体贴图外加BRDF和Cosine项的权重，如下图所示。 上方图片为场景中某些顶点的预计算结果。其中，第一张图是场景底部面片某一点的预计算结果，第二张图是植物下方某点的预计算结果，第三张图是植物叶子上某点的预计算结果。该方式可以用光栅化图形硬件来实现。论文作者对每一个点 x ，首先渲染一个高分辨率的半立方体可见性贴图。然后计算BRDF和Cosine项的权重值，并且进行降采样到环境贴图一样的分辨率。 1.4 实时渲染 在实时渲染时，论文作者首先将环境光贴图通过2D Haar小波变换计算出相应的系数向量 L 。然后，选用了一部分入射光进行计算。其主要目的是通过删减能量比较小的入射光来减少计算量。论文作者采用了三种过滤方法。第一种是直接用Haar小波系数的大小进行过滤，第二种是用传输矩阵的对应列计算出一个权重，第三种是用光源的面积大小来过滤。然后，计算 L 与 T 的乘积得到最后的渲染结果。整个计算过程是在 CPU 端进行，因为小波变换后的系数向量和矩阵是非常大的稀疏向量和矩阵，而当时的 GPU 无法支持通用的稀疏矩阵乘法运算。 二、效果对比 论文作…

基于物理的渲染—更精确的微表面分布函数GGX
type: item
date: 2017-03-02T13:16:00+02:00
description: 在上次介绍的微表面模型文章中，我们曾提到过模型中有一个模拟物体表面反射高光的函数 Rs 。在该函数中，有一个表示微表面法线方向分布情况的函数 D（Microfacet Distribution function）。基于对材质表面的观察，许多研究者提出了该分布函数的模型，比较著名的有 Beckmann（1） 以及 Blinn Phong。但是，目前在各种游戏引擎中使用最多的、同时也是效果最好的是一个叫做 GGX 的模型。研究过 PBR 渲染管线的同学可能会经常在各种技术文章中看到 GGX 这个符号。今天我们介绍的这篇论文来自于2007年著名的图形学会议EGSR（Eurographics Symposium on Rendering），而 GGX 也正是首次在这篇文章中提出。 这篇论文的题目是《 Microfacet Models for Refraction through Rough Surfaces 》，它所解决的问题是，如何将微表面反射模型推广到表面粗糙的半透明材质，从而能够模拟类似于毛玻璃的粗糙表面透射效果。同时，文章作者提出了一种新的微表面分布函数 GGX 。并且，通过与前人提出的模型以及真实测量数据做对比，证明 GGX 能够更好地拟合真实测量数据，比前人提出的模型更加精确。 虽然在这篇论文中 GGX 被用来渲染表面粗糙的半透明物体，但是 GGX 作为一种描述微表面法线方向分布的函数，同样适用于渲染表面粗糙的不透明物体。例如在著名的游戏引擎Unity和UE4中，GGX 就被用于渲染不透明物体。下图(2)展示的是UE4引擎的渲染PBR结果，其中微表面分布函数采用的就是 GGX 。 接下来我们介绍这篇论文的内容。首先，我们来介绍这篇论文的渲染效果图，如下图所示： 图中渲染的是一个半透明的球体，该球体表面既有光滑部分也有粗糙的部分。透过光滑表面可以清晰地观察到背景图中不同颜色的条状纹理，而透过粗糙表面则纹理的形状和边界变得比较模糊。同时，可以看到在球的顶端出现了高亮反射的现象，这是由于球面对顶部光源的反射造成的。因此，通常在渲染既有反射又有透射的情况时，我们通常采用BSDF（Bidirectional Scattering Distribution Function）来模拟。这篇论文中的BSDF既包含了反射模型BRDF（Bidirectional Reflectance DistributionFunction）又包含了透射模型BTDF（Bidirectional Transmission Distribution Function）。接下来，我们先介绍这篇论文的BSDF以及其中包含的各项函数，然后介绍论文与前人提出的方法的对比试验。有兴趣的读者可以选择继续阅读，或者直接跳转到后面结果部分，查看论文的更多渲染结果。 一、论文BSDF介绍 给定物体表面某一点的法线方向 n ，入射光方向 i ，以及出射光方向 o ，则该物体表面材质的 BSDF 可以表示为 BRDF 和 BTDF 之和： 其中，fr (i,o,n) 表示 BRDF ，ft (i,o,n) 表示 BTDF 。对于 BRDF ，论文采用了 Cook-Torrance 模型的形式： 唯一不同的是，论文作者将 Cook-Torrance 模型公式中分母的 π ，改成了常数 4 。论文中的解释是，函数 D 用了不同于Cook-Torrance模型的归一化。其中，hr 表示入射方向 i 和出射方向 o 的中间向量：hr = Sign ( i ∙ n )( i + o )。对于理想镜面反射，hr 方向即为反射点的法线方向。 为了将微表面模型从 BRDF 推广到 BTDF ，论文定义了折射情况下的 ht 。如上图所示，给定折射面两边介质相对密度ηi 和 ηo ，则中间向量可以表示为： 其中，当该情况为理想折射时，ht 与法线方向相同。 根据论文中的公式推导（有兴趣的读者可以查看原论文推导过程），BTDF 可以表示为： 由上述公式可以看到，论文中定义的 ft 与 Cook-Torrance 模型中的fr 有相似的形式。其中，都包含了模拟菲涅尔现象的函数 F ，模拟微表面法线方向分布的函数 D ，以及阴影遮挡函数 G 。接下来，我们将逐一介绍 BTDF 中这些函数的定义。 二、F、G、D 函数的具体形式 首先，我们介绍菲涅尔项 F 。论文作者采用了与 Cook-Torrance 模型中类似的菲涅尔项表达式： 其中，c =|i ∙ n|。与Cook-Torrance模型不同的是，g 被定义为与介质密度相关的函数： 当内部全反射发生时，F =1。 对于阴影遮挡函数G，论文作者采用了与 Cook-Torrance 模型不一样的函数：Smith shadowing-masking3。该函数…

微表面模型－PBR渲染管线的材质
type: item
date: 2017-02-24T12:30:00+02:00
description: PBR渲染管线之所以能够比较真实地表现各种不同的材质，是因为它采用了更加复杂的材质模型。在PBR渲染管线出现之前，我们通常采用的材质模型由三部分组成：环境光（Ambient）、漫反射（Diffuse）以及镜面反射（Specular）。我们采用Lambert模型来模拟漫反射散射，用Phong模型来模拟镜面反射高光。但是这种模型难以模拟出表面不同的粗糙程度造成的不同反射效果，导致它模拟出来的材质在视觉上看起来更加接近于塑料的光滑表面。 PBR渲染管线中采用的是一种叫做微表面（Microfacet Model）的材质模型，它基于物理的观察，认为物体表面由很多凹凸不平的微小镜面组成。这些具有不同大小、方向的微表面在对入射光线进行反射时产生了不同的反射效果，从而使得人眼能观察到不同的材质属性。因此，微表面模型能够更加真实地模拟各种不同的材质，如下图所示： 虽然PBR渲染管线是近几年才被应用到游戏渲染领域，但是微表面模型早在上世纪80年代就在计算机图形学领域被提出。今天介绍的这篇技术论文是于1981年发表在ACM Computer Graphics的文章。这篇论文提出了一个对真实世界材质模拟的数学模型，它就是著名的Cook-Torrance模型。Cook-Torrance模型对计算机图形学材质模型的研究发展具有重要的影响。直到今天，我们仍然可以看到许多游戏引擎的PBR渲染管线中采用Cook-Torrance材质模型的简化版以及它的变种。 在这篇论文中的Cook-Torrance模型出现之前，大部分计算机图形学中模拟物体材质模型的设计思路都是基于几何光学，如：模拟理想漫反射的Lambert模型、利用余弦函数指数函数模拟高光的Phong、以及将grazing angle的高光考虑在内的Blinn等。这些模型能够很好地模拟一部分真实世界的材质，但是仍然有些材质无法模拟。Cook-Torrance模型则不同，它基于的是一个物理现象，即物体表面是由许多微小的平面组成。这些平面的朝向各不相同，而对于光滑的物体，微小平面朝向分布比较统一，对于粗糙物体，微小平面的朝向分布更加散乱。这使得Cook-Torrance模型能够更加通用，并且能够模拟表面粗糙的材质。前人提出的模型在模拟镜面反射以及高光的效果时更像是塑料，而Cook-Torrance不仅能模拟塑料，也能很好地模拟金属等粗糙表面的高光现象。 接下来我们将首先介绍文章中的反射光照模型，即Cook-Torrance模型的通用表达式。然后，介绍高光项的表达式。因为基于微表面物理模型与传统的解析模型最大的区别，就在于对镜面反射高光项的处理不同。基于微表面模型的高光项，引入了更多的考虑因素，如：菲涅尔现象、微表面的朝向分布函数、以及阴影遮挡项，才使得其能够成为更加通用材质模型。 一、反射模型 给定光源、物体表面以及观察者，反射模型描述了光线从光源方向射向物体表面，然后从观察者的方向被反射出去的情况。其中，包含了光的强度以及颜色信息。被反射的光的强度和颜色取决于光源射出的光强度和颜色，以及物体表面的反射能力。通常我们用BRDF（Bidirectional Reflectance Distribution Function）函数来描述物体表面对光的反射能力。接下来我们将介绍文章作者是如何定义这个函数的。 物体表面反射能力函数，即 BRDF 函数，可以定义为：从 L 方向射入的光线有多少从 V 方向被射出。假设入射光为无穷远的方向光，并且光强用 Ii 表示，则从 L 方向入射到 P 点的光能可表示为： 其中，ω 为入射光方向角。若用 R 表示 BRDF 函数， Ir 表示反射光线的强度，则 Ir 可表示为： 其中，s + d = 1 分别表示高光和漫反射系数。如果再加上环境光影响，则上述公式可变化为： 上述公式即为文章中的光照计算表达式。 二、高光项及其中各项表达式 文章作者定义了一个光源方向和视线方向之间的一个向量 H 。如上图所示，给定物体表面一点 P ，以及光源方向 L 和视线方向 V 。则其中间向量可以由如下公式表示： 其中，θ 为 L 和 V 之间夹角的一半。因此， 文章作者假设环境光为一个恒定值，漫反射为理想漫反射，于是 Ra 和 Rd 与视线方向无关。但是高光项 Rs 与视线方向有关。根据微表面模型的定义，物体表面由无数朝向不同微小平面组成，每一个微小平面可以看作一个镜面，对入射光产生镜面反射。因此，只有法线方向与 H 相同的微小平面才会对高光项产生贡献。定义高光项的形式为： 其中，F 为菲涅尔项、G 为阴影遮挡项、D 为朝向分布项。接下来我们将一一介绍这三项的表达式。 首先，我们介绍阴影遮挡项。根据前人提出的模型，G 函数可以用如下公式表示： 朝向分布函数 D 描述了微小平面中朝向 H 方向的平面的…

基于物理的渲染—迪士尼的渲染模型
type: item
date: 2017-02-17T04:37:00+02:00
description: 今天给大家介绍的是一篇关于基于物理渲染（Physically Based Rendering）的技术论文。该篇论文是在2012年Siggraph图形大会上，由迪士尼公司分享的关于PBR技术的报告。PBR是最近游戏渲染领域中比较高级的渲染管线。相比于传统基于Lambert以及Phong模型的渲染管线，PBR采用更加真实的材质模型，能够更好地表现物体表面不同粗糙度带来的不同反射效果，从而能够更贴近真实地模拟各种不同的材质。采用PBR的材质能更好地模拟金属、非金属以及不同粗糙度等材质对光的反射效果。虽然PBR在最近几年才被用于实时的游戏渲染，但是早在几年前它就被用于离线的电影渲染中。而这篇论文正是基于前人提出的材质模型，通过对真实测量的材质数据进行分析对比，提出新的材质模型。最终，迪士尼将这一方法应用到他们的电影渲染中。 我们推荐这篇论文，希望对PBR渲染管线原理有兴趣的开发者，能够通过此文加深对PBR的理解，从而能够在项目开发中更好地利用PBR管线，达到满意的渲染结果。 如上图所示这是迪士尼公司出品的动画电影 Wreck-It Ralph 中的截图。可以看到人物头顶的金属皇冠、非金属衣领都能达到贴近真实的渲染效果。 不同于前人提出的基于物理的材质模型，这篇文章的材质模型在设计之初并不是以物理正确为原则，而是以让美术设计者更容易理解和使用为原则。文章作者认为是否是物理正确并不重要，重要的是能达到美术设计者的需求并且使用方便、容易理解。因此，他们提出了5个主要的设计原则： 使用方便、便于理解比物理真实更重要； 可调节参数越少越好； 参数的值都必须在效果可接受的范围内归一化到（0～1）之间； 参数可以被赋予超过其实际可接受范围（0～1）之外的值； 所有参数组合的效果都必须是可接受并且稳定； 基于这5个原则，文章作者提出了用11个参数表示的材质模型，根据不同的参数，可以渲染出不同的材质，如下图： 从上图可以看到，经过对参数的简化，文章提出的材质模型用了11个参数即可非常真实地模拟出金属、非金属以及不同粗糙度的材质光照结果。 文章作者基于上述的5个原则以及对真实测量数据的观察结果，对传统的微表面材质模型中的各项函数进行修改。接下来我们首先介绍传统的微表面模型的通用表达式，然后对其中的每一项函数进行说明，并介绍在文章中采用的各项函数的表达式。 文章中的模型采用了微表面模型的通用形式，该通用形式最早出现在Cook-Torrance模型中： 其中，向量 l 和 v 分别表示入射光和视线方向，向量 h 表示 l 和 v 之间的中间向量，它们与法线方向的夹角分别用对应下标的 θ 表示， θd 表示 l 和 v 之间夹角的一半。diffuse 表示漫反射函数，D 表示微表面分布函数，F 表示菲涅尔系数， G 表示阴影系数。文章中模型的 diffuse 函数是： 其中，roughness 表示粗糙度。对于微表面分布函数 D，目前最好的分布函数是著名的 GGX 函数。但是，文章作者采用了比 GGX 更为通用的形式 GTR （Generalized-Trowbridge-Reitz）： 它与 GGX 的区别在于， GGX 为上式中 γ= 2 时的结果。文章作者采用了两个不同的 GTR 函数来拟合高光项，分别采用 γ= 1 和 γ= 2 。α 的取值为 roughness 的平方，c 为一个常数用于调节整体缩放。对于菲涅尔项 F，文章采用了 Schlick 的公式： 其中， F0 为一个常量，其值取决于材质的透射系数。对于阴影系数 G ，文章作者采用了 Walter 在其论文中根据 GGX 推导的 G 公式，并将公式中的 roughness 从 [0, 1] 缩放到[0.5, 1] 范围。做这个缩放的原因是，根据与实际测量的数据对比以及美术设计者的反馈，高光在 roughness 值较小时显得过于亮。虽然这个缩放的过程使得模型不再物理准确，但是它符合了美术设计者的需求，这也正是这篇文章最主要的设计原则。 在下文中，我们将为大家介绍文章的实验部分，也就是如何对真实采集数据进行观察，并设计材质模型的。大家可以根据兴趣继续阅读，也可直接跳到后面查看结论和未来工作部分。 一、可视化真实采集的BRDF数据 文章作者使用 Matusik 在2003年发表的论文中的数据集，该数据集可以免费从 Mitsubishi 实验室官网下载（www.merl.com/brdf）。该数据集包括了木材、金属、石头、塑料、橡胶、纤维等真实材质的数据。每种材质根据不同入射角和出射角度进行采样，如下图： 文章作者开发了一套展示真实测量材质数据以及用 BRDF 模型渲染的结果进行比较的系统，该系统可以在 GitHub 上免费下载（github.com/wdas/brdf），如下图所示： 其中，可以…

基于功耗预算的实时绘制
type: item
date: 2017-02-10T11:37:00+02:00
description: 惟学无际是UWA在2017年推出的全新研究型专栏，我们将为大家推荐极具实际价值的学术论文，并梳理其中的研究背景、实现原理和执行方法等。内容专注于游戏、VR和AR相关的计算机图形学领域。正所谓问渠哪得清如许，为有源头活水来 ，希望大家在研发的过程中不仅知其然，还能知其所以然。 今天给大家介绍的是一篇以画面质量与设备耗电量为引导的渲染技术论文，该论文发表于2016年著名的Siggraph图形学大会。一般来说，图像渲染质量的提升往往意味着每个像素都要进行更多的数据计算，从而造成设备耗电量的增加。对于对耗电量非常敏感的移动设备来说，我们往往需要在画面质量与设备耗电量间进行权衡。如何使用尽可能少的耗能来渲染出高质量的画面，这几乎是每个游戏团队都在思考的问题。因此，我们推荐这篇论文，希望文章中作者对于该问题的思考和提出的解决方法可以对你的项目有所帮助和启发。 先来看一下本文方法的效果图： 我们知道，渲染参数（比如Shadow Mapping、SSAO的相关参数以及图像分辨率等参数）决定了图像质量。上述效果图的意义如下： 上图左侧部分是同一场景在不同渲染参数下得到的不同质量的三幅图像，分别为最低质量的渲染图像、本文使用根据耗电量优化后的参数渲染出的图像、最高质量的渲染图像； 中间部分是三幅图像的细节比较，可以看出在图像质量方面（高光、阴影、反射等细节），本文方法得到的渲染效果与最高质量的效果相差不大，并且远好于最低质量的渲染效果； 右侧图表则是各个方法在耗能和渲染质量上的数值比较。下方的图表表示不同方法渲染质量的差距，可以看到本文方法的画质（橙色）与最高画质（绿色）相差不大，但远高于最低画质（蓝色）。而上方图表表示三种方法的耗电量统计，在画质相差不大的情况下，本文方法进行渲染的耗电量（橙色）远低于最高画质的耗电量（绿色），比最低画质的耗电量（蓝色）也高出并不多。 综上所述，本论文方法可以在基本保持渲染质量的情况下，让设备的耗电量大幅降低。根据论文中描述，其具体可以减少30%~50%的电量消耗。 接下来我们来概括一下本篇论文的渲染框架。设备输出画面的视觉效果与渲染参数有关，我们将一组渲染相关参数（Shadow Mapping，SSAO，Resolution等）的组合记为s。除了渲染参数，画面展示的场景内容还与相机的位置与朝向有关，将其记为c。这样，渲染出的效果图像就可以看作是s与c的函数，记为f（s，c）。场景渲染时，在给定相机位置与朝向c后，确定一组渲染参数s，设备便能够根据s与c输出画面f。前面提到，渲染参数决定了图像的质量，同样也决定了耗电量的多少。这样，渲染的关键问题就变为如何寻找一组合适的参数，使设备能够在满足低耗电的前提下尽可能地保证画质。文章通过一个优化过程来解决该问题。根据较高画质和较低电量消耗这两个目标，可以构造出一个优化方程组，对其求解便可以从众多可能的渲染参数组合中确定一组最优的组合，记作Sopt。通常求解Sopt难以做到实时，因此本文使用了预计算方法：对于每个可能的相机位置/朝向c，预先建立相应的帕累托曲线P（计算耗时，但算好后可以根据P快速找到Sopt），存储（c，P），之后在实际运行时，根据当前的相机位置，在查找表中通过临近的c查找对应的P，利用P再加上用户指定的图像质量和耗电量要求就够快速的搜索出Sopt，完成实时渲染。 在下文中，我们将为大家介绍该文章的大致实现步骤，大家可以根据兴趣继续阅读，也可以直接跳到后面查看具体的效果比较：） 一、算法框架 渲染的关键是确定合适的渲染参数，文章将参数s的确定转化为一个优化求解过程。由于相机不同位置c和渲染参数s所构成的参数空间是非常巨大的，并且需要优化求解的是一个多目标方程（降低电池消耗和提升渲染质量），因而本文作者尝试采用一定预处理技术来完成这一目标。概括来说，要使本文算法达到实时，关键部分有两个： 如何有效地预处理场景中不同相机位置和不同渲染参数所产生的电量消耗以及渲染质量； 如何实时地采用这些信息。 算法框架如下图： 其中绿色部分为预处理部分，黄色为实时渲染部分。在预处理阶段，文章采用了八叉树对相机可能的位置空间进行分割，在每个树节点，使用遗传算法（Genetic Programming）搜索所有可能的渲染参数组合，得到该相机位置对应的帕累托曲线P（Pareto frontiers），并将相应的（c，P）对进行存储。对于空间分割的细度，对每个树节点可以通过比较相邻节点的帕累托曲线相似度，来判定是否需要继续分化，从而保持足够的采样点来确保渲染所得图像的连贯性。 在实时渲染阶段，只需根据当前相机位置查找所有附近八叉树节点的帕累托曲线，并根据用户给定能量预算或者渲染质量差预算，在各个帕累托曲线上快速找出对应的渲染参数并进行差值，从而得当最优的渲染参数。接下来将对参数优化求…