前言
随着计算机硬件以及渲染上的进步,我们可以更好的从物理上去模拟灯光属性,从而诞生了新的工作流程 PBR 工作流。PBR是一种着色和渲染技术,基于物理的渲染过程,用于更精确的描述光如何与物体表面互动。
PBR的优势:
- 方法论和算法基于精确的计算公式,免除创作表面的猜想过程。
- 在任何光照环境都能表现出正确的结果。
- 为不同的艺术家,提供统一的工作流程。
PBR 工作流分类
PBR有两种工作流:
- Metal Roughness Worfkow(金属性/粗超度工作流程)
- Specular Glossiness Worfkow(高光/光泽度工作流程)
THREE.js 使用的是第一种工作流,名字子叫做
Metallic-Roughness
,对应材质为 MeshStandardMaterial
通用纹理:
Name | 对应 THREE.js | 说明 |
---|---|---|
Ambient Occlusion | aoMap | 表示有多少环境光,可以被表面上的一个点吸收。 |
Normal | normalMap | 用于视差映射,通过增加可见的深度感来提高渲染的真实性。 |
Height | displacementMap | 不论 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.color、MeshStandardMaterial.map
Matallic Map:(Grayscale-Linear)
描述哪些区域是金属,那些是绝缘体。值为 1
表示纯金属,为 0
表示绝缘体。
如果matalic map的灰度值低于235,那么对应的basecolor的反射率也应该降低一些。
对应 THREE.js 的 MeshStandardMaterial.metalness、MeshStandardMaterial.metalnessMap
Roughness Map:(Grayscale-Linear)
描述表面引起光纤漫反射的不规则程度,这将改变光纤的方向,但是不会改变光线的强度。光滑表面会有小而亮的高光,而粗糙表面将会出现大而暗淡的高光。在这个灰度图里面,值为 0
代表光滑表面,而 1
代表粗糙表面。
Roughness Map是一个“有故事”的贴图,它会告诉你这个表面经历过那些严酷(或者平和)的环境。
对应 THREE.js 的 MeshStandardMaterial.roughness、MeshStandardMaterial.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 是可以相互转换的,这里推荐个 小工具 可以在线转换两种工作流。
至此结束,感谢阅读。