zoukankan      html  css  js  c++  java
  • 基于物理渲染的基础理论

    本篇作为理论的概括介绍,并不涉及公式的部分
     
    基于物理渲染的优点
    很容易就可以作出真实和照片级的效果。
    同一配置可以适用于在不同HDR光照环境下。
    接口简单而直观,都是基于世界真实的参数。(如粗糙度,金属度,等等)。
    不需要美术去提供经验性的"奇怪"参数和配置。
    更容易去解决问题和扩展需求。
     
    基于物理的渲染和传统渲染区别
    有着基于物理规则的光照模式
    有着无处不在的fresnel效果
    能量守恒“energy conservation”,物体平面的反射光无法超过它所解接受的入射光
    基于物理的材质,会分辨金属和介电质,微平面的概念
    线性空间的光照,支持gamma矫正的,HDR渲染和tonemap
     
    光与物质的交互(light and matter)
    光是是一种横向传播的电磁波,电磁波的波长范围非常广,但只有390~760nm之间的一段波谱是人眼可见到的,也就是在图形学里对渲染着色起作用的部分。另外因为光有波粒二象性的缘故,有时候我们在图形学里也会把光做为光子(photon)来处理。
     
    当光投射到传感器(眼睛,照相机等)上时,颜色和亮度就会被吸收并感知,而光与物质交互后被感知的,就是物体的颜色。
     
    物质对光的影响,可以用折射率(refractive index)来描述,当由复数来表示折射率时,它的实部影响速度(相对于真空中的速度),虚部来影响光的衰减(被吸收),折射率会改变光的波长。
     
    我们先根据物质按照内部折射率是否均匀来进行分类:
     
    均匀介质(Homogeneous Media)
    内部密度相同的物质,意味着他有唯一的折射率,对应透明的均匀物质来讲(如水,玻璃),光通过时,并不会改版光的颜色或强度,而当物质对某一种可见光谱有吸收率的时候,那么,光就会随着在物质内的传播距离而逐渐被吸收,而光的方向并不发生改变,这就是光被吸收(absorption)。

    光穿透玻璃和水时,方向,颜色和强度都不会发生
     
    方向没有变化,光但随着距离会丧失强度(改版颜色),也就是光被吸收了。
     
    非均匀物质(heterogeneous medium
    非均匀物质内部的折射率非常突然的时候,这时就会发生散射(Scattering)现象,光会被分割为多个方向,但光的总量并不会发生变化。
     
     
    除了以上两种交互外,  物质还可能因为其他能量发出新的光,称为自发光”emission“。
     
    光与物质交互的三种方式,吸收,散射,发光。
     
    光与平面的交互(light and object surface)
    上一个段落讲点,光在密度不同的物质内传递的现象,而渲染中最为典型的,是发生在物体表面时,关于光与空气和物质之间的散射效果。
    这个时候平面散射光会分为两部分:进入平面的部分(折射,在物体内部传播中被吸收或散射),从平面出去的部分(反射)。
     
    一个假设完美无限光学平坦的平面(简称光学平面)反射效果,平面两侧的空气和物体有各自的折射率
     
    但实际上,平面大多都不是光学平面(除了镜子或镜头等),而是一种微几何体(Microgeometry),表面都会有一些比可见光波长要大的不规则凹凸,但又小到无法覆盖一个像素或者采样点,所以,我们就把这种非光学平面,理解为一组微小光学平面的集合,而可见光的反射,实际上是在平面各个点上轻微不同方向的反射集合,也就是后面会提到的微平面理论(Microsurface Theory)。
     
    roughness
    上面的平面相对平滑时,表面方向的变化也比较轻微,从而反射光的方向变化也较小,有了较清晰的反射。而下面的表面粗糙,表面方向的变化范围也较广泛,反射光的方向变化也比较大,出现了模糊的反射。
     
    两个平面在微观上的粗糙度(roughness)不同导致不同的反射效果
     
    漫反射光与镜面光(diffuse and specular)
    这里,我们光和平面交互分为两个项目来描述,从平面直接反射的部分称为镜面反射光(Specular),来源于拉丁语的“Mirror”,PS:镜面光的颜色,通常就是灯光的颜色,只有照射在金属上才会改变颜色(实际是金属吸收了特定波长的光),传入到物体内部,而经过折射,被材质吸收(转变为热能),或者内部进行散射,一些散射光最终会重新返回从平面折射出来,并被摄像机或眼睛所捕捉到,称为漫反射光(Diffuse)。漫反射光被物质吸收并散射后,会成为不同波长的光,这也就给予了物体颜色,比如物体吸收了蓝色以外的光,那物体就是蓝色的,而因为散射的混乱比较均匀,从每个方向看起来都是一样,所以这点和镜面光不一样。也可以使用这个名字albedo来描述。
     
    非光学平面反射Surface Reflectance和折射散射Subsurface Reflectance的宏观视图,形成了Diffuse和Specular。
     
    金属和非金属材质

    物体内部的折射光的作用,取决于物体内部的组成,内部组成的不同,可以分为,金属(metal)导体,电介质(Dielectrics)绝缘体和半导体(Semiconductors ),因为半导体在渲染中出现的机会不多,在处理物体时简单的分组为金属和非金属就可以了。金属会吸收所有的折射光,而且通常会被绝缘体的反射率要高,通常的反射率要达到60%~90%,而绝缘体则是0%~20%,反射率高,就防止了入射光被吸或折射,这样,金属就有了”闪亮“的外观。

     
    金属的折射光能量都立刻被自由电子吸收
     
    而非金属(绝缘体),光会在内部进行吸收和散射活动,最后,一些折射光会通过散射,重新从入射平面反方向射出
    非金属的折射光会进行散射
     
    导体的反射会跨越光谱,所以反射是有颜色的,虽然颜色反射在导体里比较罕见的,但在一些日常的材质里(金,铜,黄铜)还是可以看到这种效果,而绝缘体的反射通常是他们的本来颜色,因为金属会吸收所有的穿透光,也就没有任何漫反射(diffuse)部分,但金属氧化的部分和一些表面残留物还是会散射少量的光。也是因为这些原因,可以使用“metalness”(金属度)这种参数,虽然不是纯粹的pbr,但更受美术的喜欢。
     
    不同材质的漫反射颜色,金属为0.
     
    次级表面散射(Subsurface Scattering)
    从前面的图中,可以看到折射后的散射光从平面不同的点发射出来,和原始的入射点的距离也各不相同,可以统称为次级表面散射光,根据散射出的距离和入射点像素的大小的关系,可以分为两种情况:
    如左图所示,当像素的尺寸大于入射到出射点的距离时,这个距离就可以被忽略,可以认为这个平面散射出的光和入射光是在相同点上,也就是右图的样子,也就是我们常说的漫反射。
     
    当像素小于出射到入射距离时,每个点的着色就会收到其他光入射到其他点的影响,也就是常说的“次级表面散射”技术,很重要的一点是,它和普通的漫反射着色是一种物理现象(都是折射光的次级表面散射),唯一不同的就是散射的距离与观察点大小的关系,一个通常被认为是“次级表面散射”的表现,当在较远的距离观察时,就可以被认为是漫反射着色(例如远距离角色的皮肤),而“正规的漫反射着色”在很近距离观察时,也会有次级表面散射的效果。
     
    无处不在的Fresnel反射
    Fresnel表现的是材质的反射率和入射角(也就是光源入射向量和平面法线向量的夹角)的对应关系,也就是说,入射光的角度越大,反射率也会越强,Fresnel反射项通常成为F( )
     

    以水面为例,正常入射事只有3%的反射,而水平时则几乎到100%。
     
    PBR的一个改变,就是对fresnel方程的修正上。这个会在下一篇有公式的章节做进一步解释
    对于所以的材质来说,当以掠射角观察时,光滑物体接近“边缘”的地方,会形成完美的镜面,也就是说特定的角度上,“任何表面光滑的物质都可以成为完美镜面”。
    除了金属外,大部分的材质的反射和角度对应曲线或梯度的变化都不是很大
     
    非金属的反射系数,在边缘处亮度更高
     
    当入射角度为0时,非金属材质(2%~8%),水和液体是2%,砖块8%,其他有机材质和塑料是5%,半导体和晶体是15%~50% 金属60%~90%
     
    如果要达到真实的fresnel,那么美术对fresnel的控制应该越少越好,需要提供一些参数值来使用,通常是光泽度(Gloss,或粗糙度 Roughness)和反射率。提供一个基础反射率,来设置平面最小的反射值,让fresnel曲线从这个最小反射值开始,以满足不同角度的需求。
    Surface Reflectance
    前文已经提到了微几何体,之所以有微平面的概念,因为从宏观来看,在我们渲染模型网格时,使用法线贴图就可以描述表面小的细节,但这样仍然会有一定的缺失,很多真实世界的平面上,还是有一些微小的凹陷,裂缝或突起,而用肉眼是很难看清楚的,小到连正常大小的法线贴图也无法来表现,虽然肉眼无法看到,但这些微观特征,还是对Diffuse和Specular产生了影响。
     
    微平面的细节,对反射的影响更多,也就是Specular,因为粗糙的微平面会把反射光分散或者内部遮挡,所以有了下面两个项目来描述这个现象
     
    Normal Distribution Function
      因为微几何体的所以平面的方向,并不是均匀分布的,如果是分布比较均匀的光滑平面,那么光就会在几乎相同的方向反射,产生清晰的高光,如果粗糙表面则是模糊的高光. 有多少微平面点的法线更倾向宏观平面的法线方向,我们把这种平面法线方向分布的统计,称之为microgeometry normal distribution function D(),和fresenl方程不同的是,D()并没有一个类似0~1的范围,而是来帮助确定微平面法线在某一个给定方向上的集中度。
     
      所以,D()决定了高光的镜面反射高光的大小,亮度和形状,一些D()会提供前面提到的类似"Roughness(粗糙度)"的参数(也可以是glossiness),当粗糙度降低时,微几何体平面的法线方向就会更集中在宏观的平面法线方向上,D()的值也会变高。除了指定粗糙度参数外,也可以通过传递一张Glossn map的方式提供更高的细节。
    不同Roughness的表现

    左侧Specular Map ,右侧 gloss map
     
    Geometry Function  
    因为微几何体的构造缘故,一些入射光的平面点被内部遮挡,成为了内部阴影而无法接受光照(也就不能反射光)。
      
    shadowing现象
    而有一些反射光被内部遮挡,他们的反射光无法被观察到,虽然有反射光可以多次反弹后再被视点观察到,但在微平面理论里可以忽略不计了。
      
    masking现象
     
    这因为有这种现象,所以需要有一个Geometry Function G(),来代表反射光的可见度,所以G()是在0~1之间的一个范围值,在着色模型里,有时会和其他参数合并称为V()(Visiblity)。和D()一样,因为微平面有凹凸感,当它的粗糙度提高时,shadow和masking的现象也会增加,粗糙度高的平面会光滑平面更阴暗一些,G()也要收到roughness参数的影响另外G()也是下面要讲的能量守恒的一个基础,它使得反射光不会高于平面的入射光。
     
    Energy Conservation 能量守恒
    镜面反射光(Specular)与漫反射光(Diffuse)是相互排斥的,因为离开表面的光总量不能他接受的入射光强,你的漫反射与镜面反射综合不能超过1

    这意味着,如果你的希望材质有较高的镜面反射效果(高反射率),就需要要去降低漫反射,能量守恒是PBR的一个重要的方法,可以让艺术家在设置反射率和反照率时(高光颜色和漫反射颜色)不会违法物理定律
    同一个材质,从100%的漫反射到100%的镜面反射转化过程
     
    能量守恒对高光部分的处理,也称为“Energy Preserving Specular”,通常是在渲染方程里添加Normalization Factor来实现的能力守恒
    是否使用Normalization Factor的对比,左下面使用Factor的亮度更淡了一些,因为左上非能力守恒的模型反射了更多的光,而下面能力守恒的模型,高光变得更加明亮和集中。
     
    当把微平面理论引入到着色系统后,那么反射多少光,就要受到平面粗糙度的影响,渲染粗糙度较大的表面时,会获得较大范围和模糊的反射光,而光滑表面的则更清晰。虽然材质都反射相同总量的光,但粗糙平面的会把把反射分散到不同的方向,而光滑平面则反射的更为集中。比如你高光半径提高了10倍,那么暗度将提高100倍。
    pbr_theory_micro_cons.png
    Gloss的变化的反射效果,Normal Distribution Function(D()也必须是能量守恒所的。

    实际应用上漫反射较多而且粗糙的材质,会反射模糊和更广阔的高光,比较光滑而反射率高的材质则反射更明亮和紧凑的高光
     
    理论概述就先到这里,本文也是从很多资料中整理而来,不能算是原创吧,资料太多,可能收集和描述的不够全面,随着后面章节的添加,这个部分应该还会做进一步的修改。
  • 相关阅读:
    Windows 8实例教程系列 开篇
    qt 开发发布于 windeploy.exe
    qt qoci 测试验证
    vmware vmx 版本不兼容
    qt oracle
    vc qt dll
    QOCIDriver unable to create environment
    qoci 编译完 放置位置 具体根据情况
    calling 'lastError' with incomplete return type 'QSqlError' qsqlquer
    Hbase 操作工具类
  • 原文地址:https://www.cnblogs.com/TracePlus/p/4056893.html
Copyright © 2011-2022 走看看