永远相信美好的事情即将发生 😊!

Unity Shader 入门精要(冯乐乐著)学习笔记(17)——基于物理的渲染

学习 Mavis 46℃ 0评论

PBS的理论和数学基础

现实生活中,光和物体的交互过程非常复杂,但为了在渲染中对光照进行建模,往往只考虑一种特殊情况——两个介质的边界是无限大并且是光学平滑的,但观察微表面是凹凸不平的表面:

金属材质具有很高的吸收系数,因此所有折射的光往往会被立刻吸收,被金属内部的自由电子转化成其他形式的能量,而非金属材质则会同时表现出吸收和散射两种现象,这些被散射出去的光又被称为此表面散光(subsurface-scattered light):

不看微表面,继续从渲染层级大小考虑光和表面一点的交互行为,由微表面反射的光可以被认为是该点上一些方向变化不大的反射光,而折射光需要考虑更多:

接下来的内容均不考虑次表面散射的距离,而完全使用局部着色渲染。

双向反射分布函数(BRDF)

辐射率(radiance):单位面积、单位方向上光源的辐射通量L——单一光线的亮度和颜色评估。

基于表面的入射光线的入射辐射率Li来计算出射辐射率Lo,这个过程往往也被称为着色过程。

使用BRDF可以定量分析物体表面一点如何和光进行交互。

大多数情况下BRDF=f(l,v),l为入射方向,v为观察方向(双向),这种情况下,绕着表面法线旋转入射方向和观察方向不会影响BRDF的结果,这种BRDF是各项同性(isotropic)的,与之相反的是各项异性(anisotropic)的BRDF。

BRDF

理解方式:

  1. 给定入射角度,BRDF可以给出所有出射方向上的反射和散射光线的相对分布情况。
  2. 给定观察方向(即出射方向),BRDF可以给出从所有入射方向到该出射方向的光线分布。
  3. 当一束光线沿着入射方向l到达表面某点时,f(l,v)表示了有多少部分的能量被反射到了观察方向v上。

反射等式——给定观察视角v,该方向上的出射辐射度Lo(v)等于所有入射方向的辐射率乘以它的BRDF值f(l,v)——权重,再乘以一个余弦值(n,l)——投影,积分起来:

对于一个精确光源——方向确定,大小为无限小,计算某个观察方向v上的出射幅度率,lc表示光源方向(入射方向),使用一个特定的BRDF值来代替积分操作:

BRDF决定了着色过程是否是基于物理的:判断是否满足交换律、是否满足能量守恒。

交换律要求交换lv的值后,BRDF的值不变:

能量守恒要求表面反射的能量不能超过入射的光能:

基于这些理论,BRDF可以描述两种物理现象:表面反射、次表面散射。

针对每种现象,BRDF通常会包含一个单独的项来描述:用于描述表面反射的部分称为高光反射项、用于描述次表面散射的部分称为漫反射项:

漫反射项

兰伯特模型是最简单也是应用最广泛的漫反射BRDF,准确的兰伯特BRDF表示:

Cdiff表示漫反射光线所占的比例——漫反射颜色——定值:

兰伯特光照模型中n·l部分实际是反射等式中的部分,而不是BRDF,除以pai是因为假设漫反射在所有方向上的强度是相同的,而BRDF要求半球内的积分值为1,因此给定入射方向l的光源在表面某点的出射漫反射辐射率为:

基于物理的渲染使用了更复杂的漫反射项来模拟次表面散射的结果:例如在Disney使用的BRDF中,漫反射项为:

basecolor是表面颜色,通常由纹理采样得到,roughness是表面的粗糙度,下面的漫反射项既考虑了在掠射角漫反射项的能量变化,还考虑了表面粗糙度对漫反射的影响。

高光反射项

基于物理的渲染中,高光反射项大多数是建立在微面元理论的假设上的。

微面元理论认为,物体表面实际是由许多人眼看不到的微面元组成的,虽然表面并不是光学平滑的,但这些微面元可以被认为是光学平滑的,也就是具有完美的高光反射,是一个近似理论,也有缺陷。

假设表面法线n,微面元的法线m并不都等于n,也就是会把同一入射方向的光线反射到不同的方向上,而当计算BRDF的时候,入射方向l和观察方向v都会被给定,也就是只有一部分微面元反射的光线才会进入我们的眼睛,这部分微面元会恰好把光线反射到v方向上,即他们的法线m等于l和v的一半,也就是常用的半角度矢量h:

基于微面元理论的这些假设,BRDF的高光反射项如下:

D(h)是微面元的法线分布函数NDF,用于计算多少比例的微面元的法线满足m=h,只有这部分微面元才会把光线从l方向反射到v方向上。G(l,v,h)是阴影-遮掩函数,用于计算那些满足m=h的微面元中有多少会由于遮挡而不会被人眼看到,因此它给出了活跃的微面元所占的浓度。F(l,h)是这些活跃微面元的菲涅尔反射系数,可以得到每个活跃的微面元会把多少入射光线反射到观察方向上,即表示了反射光线占入射光线的比率。最后分母是用于校正从微面元的局部空间到整体宏观表面数量差异的校正因子。

上述中不同的部分又可以衍生出很多不同的BRDF实现,例如之前学习的Blinn-Phong模型,它使用的法线分布函数D(h):

unity中的PBS实现

一共实现了两种:基于GGX模型的,基于归一化的Blinn-Phong模型的。

这两种模型使用了不同的公式来计算高光反射项中的法线分布函数和阴影-遮掩函数。

默认情况下,unity使用基于GGX模型。

unity使用的BRDF中的漫反射项使用的公式是:

基于GGX模型的高光反射项公式

法线分布函数,采用了GGX模型的一种实现:

阴影-遮掩函数,使用了一种由GGX衍生出的Smith-Schlick模型:

菲涅尔反射,使用Schlick菲涅尔近似等式,Fo表示高光反射系数——高光反射颜色:

unity5 的Standard Shader

基于物理着色的shader——Standard Shader。

unity支持两种流行的基于物理的工作流程:Standard.shader金属工作流——默认,定义了材质表面的金属值、StandardSpecular.shader高光反射工作流——可以直接指定表面的高光反射颜色。不同的工作流可以达到相同的效果。

最大的不同在于设置BRDF的输入时使用了不同的函数来设置各个参数。

使用Standard Shader

金属材质:

  1. 几乎没有漫反射
  2. 有非常强烈的高光反射
  3. 高光反射通常是有颜色的,例如金子的反光颜色为黄色

非金属材质:

  1. 大多数角度高光反射的强度比较弱,但在掠射角时高光反射反而会增强——菲涅尔现象
  2. 高光反射的颜色比较单一
  3. 漫反射的颜色多种多样。

真实的材质大多混合了上面的特性。

两张校准表格,可针对不同材质调整参数:

基于物理的渲染需要使用线性空间:

使用金属工作流来实现不同的材质:

金属球:

塑料球:

一个更复杂的例子

color space记得选择为linear

设置光照环境,使用一个HDR格式的cubemap,可以让物体的反射更加真实,有利于得到更加可信的光照效果:

设置环境光照,可以选择环境光照的来源是场景中使用的skybox或者渐变值或者某个固定的颜色,还可以设置环境光照的强度。在使用了基于物理的shader,如果关闭场景中所有的光源,环境光也为0,场景中的物体仍可以接受一些光照,这些光照是反射得到的,默认的反射源是场景使用的skybox:

除了Standard shader,unity还引入了一个重要的流水线——实时全局光照(GL)流水线。使用GL,场景中的物体不仅可以受直接光照的影响,还可以接受到间接光照的影响。

设置场景的直接光照——一个平行光。在PBR中,想要渲染效果更加真实可信,需要保证平行光的方向和skybox中的太阳或其他光源位置一致,还有平行光的颜色尽量和场景环境相匹配:

平行光的模式选项中,选择realtime表示场景中受平行光影响的所有物体都会进行实时的光照计算:

可以选择baked模式,unity会把该光源的光照效果烘焙到一张光照纹理中,选择mixed模式,则unity会对静态物体(标记为static)的光照烘焙到光照纹理中,对动态物体产生实时光照。

间接光照的调节:

放置反射探针:

反射探针允许在场景的特定位置对整个场景的环境反射进行采样,并把结果存储在每个探针上,游戏中包含反射效果的物体从这些探针附近经过时,unity会把从这些邻近探针存储的反射结果传递给物体使用的反射纹理,存在多个探针则插值的到平滑渐变的反射效果。

反射探针也有三种类型:baked——提前烘焙得到该位置使用的cubemap,在游戏运行时存储的cubemap不变,只会处理static的物体。realtime——实时更新当前的cubemap,也可以从脚本中触发来控制反射探针的更新。custom——既可以在编辑器中烘焙,也可以使用自定义的cubemap来作为反射,但自定义的cubemap不会被实时更新。

反射探针有位置、范围:

使用反射探针可以模拟互相反射的效果:

使用反射探针会需要更多的计算时间。

调整材质

可以使用一些额外的纹理来提供更多的细节表现

线性空间

基于物理的渲染应该使用线性空间。默认情况下会使用伽马空间,使用线性空间可以得到更加真实的效果,缺点在于需要一些硬件支持。

进行伽马校正的原因:

亮度上的线性变化对人眼感知来说是非均匀的。

HDR——高动态范围,最高的亮度和最低的亮度之间的比值。更真实,让亮的物体真的亮,暗的物体真的暗。可以不丢失高亮度区域的颜色值,提供了更加真实的光照效果,要使用HDR,在camera中打开即可。


Mavis , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Unity Shader 入门精要(冯乐乐著)学习笔记(17)——基于物理的渲染
喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址