unity shader:基于物理渲染

设计原因:普通光照模型(兰伯特模型,半兰伯特模型,phong模型,blinn-phong模型)是一种经验模型,只能表达简单普通的光照效果。对于十分逼真的光照效果,就必须使用基于物理的光照模型。

BRDF定义:表示双向反射分布函数,通常用f(I,V)来表示,其中I代表光线入射方向,V代表光线观察方向,并且当沿着法线方向旋转I或者V时,对应的BRDF不变,就表明这个BRDF是各项同性的BRDF,反之就是各项异性的BRDF。

BRDF含义:它代表的含义通常有两个方面:
1.当给定光线入射方向角度后,我们通过BRDF就可以获取观察方向上的反射和散射光线的分布情况。
2.当给定光线观察方向角度后,我们通过BRDF就可以获取入射方向到该观察方向上的光线分布情况。

漫反射BRDF:基于次表面散射光线的BRDF,通常使用以下几种公式来表达:
1.兰伯特BRDF:使用最广泛的,也是最简单的计算公式。如下所示:
这里写图片描述
其中C_diff是漫反射光线所占的比例。
2.迪士尼BRDF:也是unity中引入的计算公式。如下所示:
这里写图片描述
其中baseColor是表面颜色,roughness是表面粗糙度。

高光反射BRDF:就是从入射方向经过物体表面直接反射出去光线的BRDF。通常使用微面元理论来表达高光反射BRDF,其公式如下:
这里写图片描述
其中F(I,H)则表示菲涅尔反射函数用来表达有多少活跃的微面元会把入射光线反射到观察方向上。G(I,V,H)表示阴影遮掩函数用来表达满足m=h的光线因为遮挡问题不能正常反射到入射方向。D(h)是微面元法线分布函数,用来计算有多少法线满足m=h,只有满足的m=h的光线才会从入射方向刚好被反射到视角方向中。而4(n,I)(n.v)表示微面元从局部空间到全局空间数量差异的校正因子。

反射等式:用来计算反射的数学公式,定义如下:
这里写图片描述
其含义为: 使用BRDF函数获取入射方向到观察方向上面的光线分布情况,然后将每一个光线乘以入射方向的辐射率再乘以观察方向上的投影来获取观察方向上的出射辐射率。最后累加起来就是观察方向上最终的出射辐射率。当光源为大小和方向确定的精确光源时,上述的计算公式可以优化为以下方式:
这里写图片描述

unity中的pbs实现:unity提供了基于物理工作流程的standard shader和基于高光工作流程的standard specular shader。unity会自动根据属性配置情况,在不同的平台下做相应的优化处理。常见的属性如下:
1.albedo:定义物体整体颜色。
2.metallic:定义物体金属强度。
3.specular:定义物体的高光强度。
4.smoothness:定义物体的平滑度。

常用的概念:
1.次表面散射渲染技术:就是光线经过物体表面时被物体内部材质吸收并沿着物体其他点散射出去的光线渲染技术。
2.辐射率:物体单位面积,单位方向上获取的光线辐射通量。
3.着色过程:从入射辐射率来计算出射辐射率的过程就叫做着色过程。
4.全局光照:也叫做GI,使用GI的物体光照效果既受光源直接光照影响,也会受到其他物体反射的间接光照影响。unity通常采用实时或者静态物体预计算的方式(如烘焙)来进行处理。同时反射的间接光照次数可以通过Lighting中的Bounces参数进行调整。
5.反射探针:允许在场景中特定位置上对整个场景的环境反射进行采样,并把结果存储在每个探针上。当物体经过这些探针影响区域时,unity就会把临近的反射探针存储的反射结果进行插值处理并传递给物体使用的反射纹理,从而得到反射效果。
6.伽马校正:摄像机拍摄到的图像都是使用8位来存储像素值,由于存储空间有限,而且人眼又对暗像素比较敏感,所以就利用编码伽马对亮像素进行暗处理。在伽马空间下,显示器会利用显示伽马将像素转换,所以得到的图像整体偏暗。而在线性空间下,会先将像素进行伽马校正,然后再交给显示器的显示伽马进行输出,从而保证像素值一致。
7.HDR:表示高动态范围,unity会将场景渲染到一个HDR的图像缓冲区中,并通过色调映射技术,将HDR图像转换到LDR图像进行显示。由于不会丢失高亮度区域的颜色值,所以可以提供更真实的光照效果,并为一些屏幕后处理提供更多的控制能力。但是需要更大的存储空间,渲染速度也会变慢。

猜你喜欢

转载自blog.csdn.net/zjz520yy/article/details/79008169