• 物理渲染-基于物理的光照模型


    http://blog.csdn.net/leonwei/article/details/44539217


    文章所用图片来自相关领域文献,如有侵权请联系撤除, 转载本文请注明出处

    1.关于光照模型

      对于图形学领域和图形学开发来说,实时渲染的光照模型是一个最最基础的问题,简单的来讲,光照模型就是用来描述在真实环境下,物体表面一点在在光照下的反射颜色值.有许许多多的光照模型试图用数学的公式来模拟这个问题,当然这即是一个物理问题,也是一个数学问题.大学时最初接触计算机图形学时,对书本上关于光照模型的推到过程就极为不解,最近为了研究基于物理的光照模型看到一篇10年siggrgrah的course,(<Physically-Based Shading Models inFilm and Game Production >中的background部分,Physically-Based Shading,其实现今大多流行于产业渲染如游戏中的技术集中来自己过去5-10年前这时间段的会议论文,读这期间的论文最能反应如今视频游戏渲染的前沿 )他是一个对基于物理的光照模型的很详细的教程,对光照模型的很多问题突然很多清晰明了了起来,尤其这篇文章中对于diffuse的解释让我顿感我一直在误解"漫反射"的意思,突然感觉很多国内基础教材的译文不准和推导不仔细会误导初学者,感觉这是篇好文,好文一定要分享,所以就有了把它较完整翻译下来的想法.
      首先本文先概述一下目前流行的几种光照模型,在图形学产业,尤其是游戏,实时的渲染要求我们不能完整的模拟自然界的光照,所以人们都是用各种计算上相对简单的光照模型去模拟.

    Lambert模型:

     用来描述Diffuse Reflection,也就是被翻译为所谓的漫反射,愚以为这里漫反射翻译的并不准确,因为漫字偏晦涩,很多人会把它理解为"普通的"反射,但其实这里Diffuse的原意是弥散,散射的意思,其实更准确的物理学上的意思应该是"物体内部大量微粒子表面的反射"或者说是物体内部的散射,和直接的反射意义不同,下图可以直观的告诉我们什么是漫反射
      
    ,漫反射不是光线从一个点直接反出来的另一个光线,而是进入物体内部被各种子微粒散射出来的n条光线
    Lambert模型这样近似的描述某一点的反射光强度:
    I_{D}=mathbf{L}cdotmathbf{N} C I_{L},
    即入射光和法线的点乘再乘以材质颜色和入射光颜色,这里为什么是入射光和法线的点乘其实国内教科书上的解释很难让人信服甚至没有解释,这里还是要从上图那个散射里面来解释,入射光的散射程度可以粗略的认为同夹角(入射光和法线)的增大而减小,比如当垂直入射时,光线完全射入物体,如果不考虑物体的吸收和折射,那这部分光线完全被散射后反射出来,认为这时反射出来的光是最强的,但是这是一个很粗略的模型,除了物体的吸收和折射,其实角度很大时,散射的区域很大,我们不能认为所有反射的光都是从入射点发出来的,不过这个模型还是可以近似描述一些塑料,大理石等亚光材质(不吸收,不折射).

    Phong模型

    给定上面的光线,Phong模型描述为I_	ext{p} = k_	ext{a} i_	ext{a} + sum_{m;in;	ext{lights}} (k_	ext{d} (hat{L}_m cdot hat{N}) i_{m,	ext{d}} + k_	ext{s} (hat{R}_m cdot hat{V})^{alpha}i_{m,	ext{s}}).
    第一项表示为环境光影响,第二项是所有光照的lambert反射,第三项是反射光线和实现的点乘后alpha次幂,这里面不仅包括了环境光和漫散射,还考虑第三项的高光,让物体能够表现出高光斑,当实现和反射线重合时,认为高光最强.这个模型复杂了一些,但是能够表现金属这种有光泽的材质,事实上这个模型也没有遵从真正的物理原理,某种程度上是为了让物体看上去有个光斑而作的模拟.

    Blinn-Phong模型

    Blinn Phong基本假设与Phong是一样的,只是提高了运算效率,用N cdot H替代上面的R cdot V ,其中H = frac{L + V}{left| L + V 
ight|},被称为半角向量.这样的目的是因为反射光线的计算R相对复杂,减少了R的计算,用半角向量简单的模拟提高了运算效率,这也是Opengl和D3d固定管线的默认光照模型,Opengl和D3D默认的光照模型都是Goround shading(即常说的点光源,像素插值)而非Phong shading的(pinxel光源)

    基本上Blinn-Phong就是我们现在游戏产业最流行的光照模型了,也是Opengl和DX的默认模型,但是随着硬件运算能力的提升和对更高品质真实感光照的追求,开发者在寻求更拟真实世界的光照模型,最近很火的基于物理的光照模型就是一种,从名字来看这种模型就是能更加真实的反应物理上光和材质上能量的转换关系.下面是对比图(源自unity引擎)



    从上面的对比可以看出传统的blinn-phong模型的高光很突兀,因为这种模型是为了体现高光而模拟了一个高光项,而下面的物理的渲染则更加贴近自然,因为在物理模型中点的光度值是按照更贴近真实物理的能量传递的反馈.
    那么什么是基于物理的光照模型,他最初来自于10年的siggraph,这篇course的题目是<Physically-Based Shading Models inFilm and Game Production >,文章的作者叫Naty Hoffman,是当时动视工作室中心的技术总监,负责全球工作室的图形学支持,文章对基于物理的光照模型解释的非常清楚,甚至很多解释我认为细致到冗余,但是消除了我很多疑虑,下面我对文章的翻译,有些许删减,但是力求不影响大意.

    2.基于物理的光照模型

    2.1渲染中的物理


    光是一种电磁波,也就是说光线会沿着垂直与它的传播方向震荡, 光的特性决定与它的波长,但是人眼只能感知其中某些波长的光(400-700nm),物体对光的影响可以被一个叫折射率的特性量化,折射率是一个复数,其实数部分描述物体对光速度的影响,虚数部分描述光被物体吸收(转化为其他能量)的程度,折射率会随着光的波长而改变.

    均匀介质

    光作用与材质最简单的情况是在均匀介质中传播.
    对于透明的介质,其折射率的虚数部分对可见光很小,意味着物体不会显著的吸收光,例如玻璃和水.然而如果介质能够吸收可见光,一般都会随着传播距离越远吸收的越多,但是在均匀介质中方向不会被改变,只是强度会随着吸收而降低.这里其实透明的物质如水其实也是会吸收光的,只是要把尺度放大到很大,水尤其对光中的红光吸收更多,例如光在大海经过很多米的传播后,光会被吸收成慢慢变成蓝色.

    散射

    在均匀介质中,光线总是沿着直线传播,但是在非均匀介质中,不同物质对光的折射率不一样,如果物质的折射率变化的缓慢且连续,光传播的路径就会逐渐变弯,而如果折射率改变的突然,光就会发生散射,一束光会被分成很多束,但是光能的总量不会变.在污浊的介质中,散射光的方向会被在原始传播方向上发生随机,而如果是不透明的物体,由于散射元素太高导致散射光线是完全随机的.向吸收一样,散射也是个观察尺度问题,即时很清洁的透明的空气,光在几百米传输之后还是会发生散射.

    平面交接处的散射


    maxwell等式可以用来计算当折射率变化时光的行为,但在大多数情况下,可以用来分析的解决方法是不存在的(因为太过复杂),但有一种情况除外,就是交界是一个无限大的,完全平的平面,这种情况可以很好的用来做shading计算,maxwell等式在这种特殊情况下就变成了fresnel等式.在这种情况下,光线不会在很多方向上发生散射,而是会分成两束光,如上图,反射光和折射光.反射角等于入射角,但是折射角则取决于物质的折射率.

    非视觉平滑的表面(反射)

    世界上绝大多数物体都不是视觉上平滑的,当物体表面的凹凸尺度大于光的波长时,这时物体表面就好比有大量的细微的平滑表面,物体表面看起来的效果就是很多有着不同方向的表面点的反射效果的叠加,如下图

    在围观上物体表面越粗糙,因为子平面的方向差异性越大,反射出来的光就越模糊,如下图

    为了渲染,我们可以用统计学的原理把这些子几何体的反射效果看成是从入射点反射出来多个不同方向的反射光,如下图(译者注:传统的光照模型我们通常认为物体绝对光滑没有子表面,即反射后只有一条固定方向的反射光)


    子表面的散射(折射)

    上面说的是反射光,那么折射光的情况是怎样呢?这取决于交界处两侧的物质组合.金属对可见光有很高的吸收系数,所有折射的光被迅速吸收,而对非金属当折射光进入物质时,这些光就会继续在里面的子物质上继续正常的光与物质的交互流程,大多数情况下,这些光在物质内的散射的足够充分以至于可以从里面再反射出来.下面左图是金属的情况,右图是非金属,光线在内部散射后又反射处理,重新发射出来的位置离原入射点已经有一段距离(我们称这个为散射距离).

    拿我们渲染的像素和入射点同散射距离做比较,有下面两种情况:

    第一种情况是像素比散射距离大,这种情况散射距离可以被忽略了,可以认为光的入射以及内部散射后发射出来的光在同一个位置,即可以简化为右上图的情况,这种情况我们就可以用一个简化的局部的处理过程来计算.
    但是还有一种情况就是我们关注的像素比散射距离短,这时每个像素的渲染还要受很多其他点的影响,这时局部渲染就不足以描述了,就需要更加专业的渲染技术来描述,这些技术被一般被称为"子表面散射"技术.不过这也是个观察尺度问题,当传统的局部渲染模型可以描述的物体,我们离他越近,它就越发变成后者.

    2.2渲染中的数学

    用来描述光传播以及对物体作用的能量的度量叫做辐射度,当渲染一个点时,我们定义Li为进入这个点的辐射度,Lo为离开这个点的辐射度.

    2.2.1BRDF

    通常我们认为光线是可以在局部处理的,如上面图的第一种情况,这时一个点对光的反应只取决于入射光的方向和视线的方向,我们定义v为反射光的单位矢量,l为入射光的反方向单位矢量,该点对光的反应可以用一个叫BRDF(

    Bidirectional Reflectance Distribution Function )(双向反射率分布方程)的方程来描述,它表示为f(l,v). 

    BRDF可以用两种方式来解释,一种是给定入射光线,BRDF给出离开入射点的所有方向上反射光线和散射光线的分布,另一种解释是给定观察者对于该店的视线,BRDF给出进入这个视线方向的所有入射光线的分布,如下左右两图



    BRDF常被用在反射等式中,反射等式定义如下:


    其中的f(l,v)就是BRDF,这个反射比等式可以这样解释:离开表面的光线能量=(进入表面的光线能量*BRDF*cos系数)的积分,并且f(l,v)=f(v,l)。

    BRDF描述了光线作用表面后的两种物理现象:反射和散射,在BRDF中用于描述反射项通常称作“Specular”高光,用于描述散射的项称作“diffuse”漫反射(其实这个漫反射是内部微表面的散射造成)


    2.2.1.1brdf的表面反射项(specular高光项)

    物理渲染中的高光项是基于微表面理论,这里还要假设表面有大量的细微的以至于无法直接看到的微表面,每个微表面都是绝对光滑的,而根据前文绝对光滑表面只把光线分成反射和折射两条光,而这两条光的方向要依赖于微表面的法线M。当计算BRDF的时候,入射光线L和视线V通常也要指定。这意味着在成千上万的微表面中,只有那些恰好反射光线同V一致的面才真的可以计入计算,如下图只有红色的这些微表面才真正对BRDF有贡献。

    我们定义l和v中间一半的向量为h(也称半角向量),这样就是那些法线m=h的微表面会被计入BRDF,但是也不是全部,有些m=h的微表面可能会在l方向上或v方向上发生阻挡(前者叫阴影区,后者叫蒙版区),如下图,微表面理论假设所有在这样区域的光能从高光项中移除,但是在现实中,这些阻挡的光线可能经过继续的多次反射后又被我们看到,但这不在微表面理论讨论的范畴。

    基于上面的假设,BRDF中高光项的表示为


    这其中F是半角向量为h处的fresnel反射,G项是那些与视角V朝向一致的微面的比例,D项是微面朝向的分布,分母是对那些被遮挡的光线的修正。

    2.2.1.1.1fresnel反射项
    fresnel反射计算的是在绝对光滑表面光的反射,它取决于两个参数,入射角和材质的折射系数,这里的折射系数都是rgb的向量。完整的fresnel等式非常复杂,并且非常不适合美术调整参数。然而通过观察真实世界材质的特性可以得到一个简单的表达式。这里可以先观察下图



    这图是不同材质反射光能随入射角变化的曲线。可以看出反射的能量在0-45度入射角时基本保持不变,但是在45-75度会改变的非常明显(译者注:这个与我们传统的光照模型假设高光反射不随入射角损失能量不同),最后在75-90度反射能量会迅速达到1,因为在0度附近值基本固定不变的,这个0度的值有特殊的意义,它也是表示材质对光颜色的选择性反射,基于这些因素,我们把这个F(0)值认为是材质表面的反射颜色,记为Cspec。

    Cspec看起来像一个理想的fresnel反射值的估计,后来Schlick提出了一个快速并且近似的方程计算反射值,

    这就是对上图曲线的近似方程,给出Cspec,入射光和法线就能近似得到绝对平滑表面下的反射光的值。这个近似方程也广泛的应用于计算机图形学领域,对于活动微面(我们可见的)的特殊情况,n也可以用半角向量h代替。
    下图是各种材质的F(0)
    观察这个表可以就看出金属的F(0)要明显高于非金属,它的F0超过50%,而钻石(最亮的非金属),在F(0)只反射17%的光,几乎很少有非人造的材质的F0在20%-40%区间,这些通常是一些人造合成品,它们也很少出现在渲染中,同样小于2%(水的F0)的材质也很少见,事实上,如果除了金属 宝石 水晶之外,你能看到的大部分自然界的材质的f0都集中在2%-5%这个很窄的区间。

    2.2.1.1.2法向分布项
    对于大部分的表面,微表面的朝向并不是一致分布的。那些和整个表面总体法向一致的微表面有着更高的分布,确切的分布是通过微表面法线分布方程D(M)来定义的,它的值域并不限制在0到1内,虽然不可能为负数,但是可以任意的大,在BRDF里面,D()用来衡量H方向的分布(那些m=h的微面(即视线可见的)),所以BRFD里写为D(h)。
    D()可以决定高光的大小亮度和形状。很多图形学文献中的法向分布方程都是类似高斯方程的,里面带有一些模糊或可变参数,随着物体表面粗糙程度的减小,趋近与总体法向N的微面的分布变多,这时D值会变得非常高,(在极限情况下,一个绝对的镜面,D(m=n)是无限大的),Water等人在《Microfacet Models for Refraction through Rough Surfaces》这篇文章中详细的论述了D()的计算。

    2.2.1.1.3阴影-遮罩项
    在BRDF相关文献中它又常备称为几何体项,G(L,V,H)表示示在法线m时,微面从入射光l和视线v双向上都可见的几率,值域是0-1,G项对于BRDF中光能的守恒来说是必要的,没有这项,表面计算出来的反射光可能会比入射光多。brdf的一个关键因素是可见微表面占总微表面的比例,如果阴影遮罩的面不算的话,可见表面可能算出来会比总的表面多,这就违反了能量守恒。

    2.2.1.1.4微表面模型
    D()和G()计算模型的选择是相互独立的,他们可以分别使用不同的微表面模型,可以在很多论文里找到他们的计算,一旦D和G确立了,完整的BRDF就会被所选的参数确定。微表面的BRDF有紧凑的参数化,通常只包含一个RGB值(为了F(0))和一个表示粗糙度的标量值。

    2.2.1.2子表面反射(漫反射项)

    对于表面局部反射模型来说,最广泛使用的还是朗伯模型,这其实就是一个常量,我们所熟知的cos值(L点乘N),是fresnel反射方程的一部分,而不是BRDF,在BRDF中的子表面反射项(漫反射项)的定义则是


    在这里Cdiff是光线被折射后被漫反射的部分,,Cspec(也就是F(0))通常被认为是表面颜色, 而Cdiff通常被认为是漫反射颜色。

    2.2.2渲染的实现
    前面的部分我们看到了在表面渲染中的数学模型,这里我们将讨论在电影和游戏中的产业上的实现。
    2.2.2.1通用光照
    在大多数情况,BRDF必须要与其他来自不同方向的入射光整合在一起进行计算。这不仅包括主的入射光源,还包括像天光,还有来自其他表面反射后出来的光,全局光照(GI)算法就是位了解决这些问题的,关于这些GI的详细的算法不在本文的讨论范畴,可以参考一些其他文献。

    2.2.2.2精准光源

    一个更加多的限制是,同时也是通常工业渲染中常见的情况是光照环境是有一个或多个"精准光照"组成的,这里的精准光源是指由计算机模拟的点,方向或者聚光光源,因为这些光源都是发光体无限小并且无限明亮的,所以他们和物理世界的真实光源是不一样的,但是在很多情况下他们也能产生合理的光照结果,同时给计算机的计算带来方便.精准光源用参数光源颜色Clight和光线方向Lc来表示.为了美术的方便,精准光源的颜色Clight不是直接按照光源强度的辐射度度量的,而是被定义为对于一个纯白色的lambert表面,当这个光从垂直与表面的方向照射时表面的颜色.

    精准光源的主要优点是他显著的降低了反射方程的复杂度,精准光源的反射方程是


    他比原始的反射不等式简化很多,这里的NL最小不能低于0.

    对于方向光来说,n和l在场景中都是常量,对于点光和聚光,n和l都是变的,在现实中,Clight是随着距离的平方而衰减的,但是在实践中,我们经常用其他的一些衰减公式来替代.

    如果同时有多盏光照,每个光源都要按照上面的反射公式计算后相累加,但是精准光源不能只计算他们自己,因为缺少任何从其他方向发射来的光很容易被发现,尤其是当表面是高度高光的时候.所以精准光源经常要同一些周围的环境光配合在其一起,这些在下面描述.


    2.2.2.3.1环境光
    这里我们把环境光定义为一些低频率的光源,可以简单的表示为代表了各种方向来的一个常量的光强,也可以更复杂到用球谐光照来表示(SH),通常这种类型的环境光被应用在BRDF的漫反射项上,而更加高频的基于图像的光照则应用在高光反射项上,然而也可以把它用在漫反射项上.

    2.2.2.3.2基于图像的光照
    基于图像的光照通常是通过光照贴图来完成的,  这些贴图代表较远的光源,如果在某一个合适的位置采样(例如在物体的中心),贴图就可以很合适的代表远处物体反射来的光.为了正使用BRDF和环境贴图正确的处理局部渲染,通常需要很多个采样,按照重要性的采样可以帮助把采样的数量降低到一个合理的水平,另一个重要的方法是环境贴图的预滤波.<

    Image-Based Lighting and Physical Shading at ILM >中有关于在视频游戏中使用环境贴图的更多的讨论.


    延伸阅读:

    <real time rendering >第三版 的第七章有关于基于物理渲染更多的细节,<Principles of Digital Image Synthesis >, 和 Digital Modeling of Material Appearance  >有更深的讨论.

    3.结语

    文章对基于物理的渲染的基本理论做了深入的讨论,但是具体工程上,尤其在游戏渲染中的实时和高效性,简单来说基于物理的光照模型和传统的光照模型相比,传统模型做了大量的"假设",lambrt漫反射假设表面所有子表面的散射值简单的随入射角改变,并且和为一定值,而phong模型的高光则假设物体表面是绝对平滑的面,而基于物理的模型就是基于更加接近真实的"微表面理论",把物体还原成真实的大量连续的微表面,完整考虑光的直接表面反射,子表面散射和光被物体吸收这三个条件,而如果结合全局光照,则将带来更加照片化的真实感受.当然随着硬件飞速的发展,很快又会有更加还原真实物理的光照模型可以被硬件计算.

  • 相关阅读:
    BOI 2002 双调路径
    BOI'98 DAY 2 TASK 1 CONFERENCE CALL Dijkstra/Dijkstra+priority_queue/SPFA
    USACO 2013 November Contest, Silver Problem 2. Crowded Cows 单调队列
    BOI 2003 Problem. Spaceship
    USACO 2006 November Contest Problem. Road Blocks SPFA
    CEOI 2004 Trial session Problem. Journey DFS
    USACO 2015 January Contest, Silver Problem 2. Cow Routing Dijkstra
    LG P1233 木棍加工 动态规划,Dilworth
    LG P1020 导弹拦截 Dilworth
    USACO 2007 February Contest, Silver Problem 3. Silver Cow Party SPFA
  • 原文地址:https://www.cnblogs.com/nafio/p/9137195.html
Copyright © 2020-2023  润新知