PBR的概念、基本原理和使用中要遵守的规则。这节主要参考的是Allegorithmic公司官方的英文教程,同时也融合了我在其他资源上看到的一些有价值的知识点。
首先我们来看一下什么是PBR。PBR就是Physically-Based Rendering的缩写,意为基于物理的渲染。它提供了一种光照和渲染方法,能够更精确的描绘光和表面之间的作用。它不仅擅长用来表现非常写实的材质,同时也能用来处理风格化的资源。
PBR有两种主要的工作流,一种是Metallic/Roughness(金属值/粗糙度),另一种是Specular/Glossiness(镜面反射/光泽度)。这里我们说的工作流,是指数据以何种形式输入到引擎中。
我们着重来看一下第一种工作流。
根据菲涅尔效应,对于所有的材质来说,当以掠射角观察时,光滑物体接近“边缘”的地方,会形成完美的镜面,也就是说特定的角度上,“任何表面光滑的物质都可以成为完美镜面”。
我们说金属的镜面反射值高达70%-100%,反映在Metellic工作流中,就是Metallic值为1的部分,它所对应的base color,实际上就是metal reflectance,也就是金属的镜面反射值。
我们现在来看一下两种工作流的不同点。
Unity支持两种工作流,而UE4则只支持metallic工作流。Substance Designer两种工作流都支持,而Substance Painter官方说只支持metallic,如果要用specular工作流需要单独下载shader。
在低分辨率贴图中边缘瑕疵问题会比较明显
Specular工作流,边缘瑕疵也是有的,是黑色的,但是非常不明显。
Specular工作流对理解PBR有更高的要求,例如需要为非金属提供正确的F0值,为金属提供黑色的漫反射值,以及如果没有shader负责处理,则需要提供能量守恒方案。
综合上述两种工作流的优缺点,以及引擎和使用工具的情况来看,我个人比较偏好使用Metallic/Roughness工作流,也就是第一种工作流,那我们就来看一下第一种工作流的贴图创建规则:
接下来我们看一个在实际工作中经常会遇到的问题,就是为什么Substance中的预览效果与导入引擎实际渲染效果差别很大?
人眼感知是非线性的,即使今天的显示器是数字的,它们仍然采用伽马编码信号作为输入。伽玛空间的公认标准称为sRGB,该标准定义了一个伽马空间映射到线性空间。
贴图往往被保存在伽马空间中,Shader计算要在线性空间中进行,以保证数学计算的正确性。但结果应在伽马空间中呈现,以使我们的眼睛看起来正确。因此,当贴图在着色器中采样时,由于是基于伽马校正过的值所以会导致计算不准确的结果。
最后我们总结一下PBR的关键要素:
1.能量守恒,反射的光线永远不会比照到表面的入射光线更亮。2.菲涅尔,非金属的F0值变动很小,只在2%-5%区间内;而金属的F0值范围在70%-100%。