前言

随着计算机硬件以及渲染上的进步,我们可以更好的从物理上去模拟灯光属性,从而诞生了新的工作流程 PBR 工作流。PBR是一种着色和渲染技术,基于物理的渲染过程,用于更精确的描述光如何与物体表面互动。

PBR的优势:

  1. 方法论和算法基于精确的计算公式,免除创作表面的猜想过程。
  2. 在任何光照环境都能表现出正确的结果。
  3. 为不同的艺术家,提供统一的工作流程。

PBR 工作流分类

PBR有两种工作流:

  1. Metal Roughness Worfkow(金属性/粗超度工作流程)
  2. Specular Glossiness Worfkow(高光/光泽度工作流程)

THREE.js 使用的是第一种工作流,名字子叫做 Metallic-Roughness,对应材质为 MeshStandardMaterial

通用纹理:

Name对应 THREE.js说明
Ambient OcclusionaoMap表示有多少环境光,可以被表面上的一个点吸收。
NormalnormalMap用于视差映射,通过增加可见的深度感来提高渲染的真实性。
HeightdisplacementMap不论 PBR 还是非 PBR,NormalMap 都是用来模拟表面细节,同时还会影响 Roughness 和 Glossiness 映射。

Metal Roughness Worfkow

不易出错,省内存,但是白边现象更明显。

Base Color:(RGB-sRGB)

包含信息:绝缘体,反射颜色。金属,反射率。最亮色不应超越 240RGB,最暗色应在 30-50 RBG 之间。

不包含其他光照信息,比如 amblient occlusion。金属反射率应该在 70%-100% 之间。也就是 180-255 RGB,油漆和氧化的部分应该按照绝缘体处理。

对应 THREE.js 的 MeshStandardMaterial.colorMeshStandardMaterial.map

Matallic Map:(Grayscale-Linear)

描述哪些区域是金属,那些是绝缘体。值为 1 表示纯金属,为 0 表示绝缘体。

如果matalic map的灰度值低于235,那么对应的basecolor的反射率也应该降低一些。

对应 THREE.js 的 MeshStandardMaterial.metalnessMeshStandardMaterial.metalnessMap

Roughness Map:(Grayscale-Linear)

描述表面引起光纤漫反射的不规则程度,这将改变光纤的方向,但是不会改变光线的强度。光滑表面会有小而亮的高光,而粗糙表面将会出现大而暗淡的高光。在这个灰度图里面,值为 0 代表光滑表面,而 1 代表粗糙表面。

Roughness Map是一个“有故事”的贴图,它会告诉你这个表面经历过那些严酷(或者平和)的环境。

对应 THREE.js 的 MeshStandardMaterial.roughnessMeshStandardMaterial.roughnessMap

Specular Glossiness Worfkow

镜面反射工作流容易出错,因为 Specular 包含了全部的绝缘体 F0 信息,1.0 的 Diffuse 和 1.0 的 Specular 将会使得反射折射能量大于输入能量,这违背了能量守恒定律。也就是说在绘制贴图时,你无法预览结果。

Specular 材质在 THREE.js 中未实现,可以利用自定义 ShaderMaterial 来实现,具体实现参考 这里

Diffuse:(RGB-sRGB)

包含 Albedo Color,但是不包含任何反射率信息。纯金属为黑色,因为纯金属没有颜色,油漆和锈迹是需要带有颜色的。基础颜色应不包含光照信息,除了 micro-occlusion。黑色不应低于 30-50sRGB,亮色不应高于240sRGB。

Specular:(RGB-sRGB)

灰度值,表示非金属 F0 RGB 值,表示金属吸收的不同波长的光线。这种贴图允许使用不同的F0值来表现非金属。

Glossiness:

与 Roughness 相反,值为 0 代表粗糙表面,而 1 代表光滑表面。

小结

Metal/Roughness 与 Specular/Glossiness 是可以相互转换的,这里推荐个 小工具 可以在线转换两种工作流。

至此结束,感谢阅读。