1.PBR简介
2.高光工作流
3.金属工作流
1.PBR简介
PBR(Physically Based Rendering, 基于物理的渲染)的工作流分为金属工作流和高光工作流
2.高光工作流
高光工作流是一种传统的工作流, 现在用的相对较少, 但是在某些特定情况下能提供更精细的控制a.核心思想它不区分金属和非金属, 直接指定镜面反射的颜色和强度b.所需贴图/参数- Albedo 反照率贴图只表示漫反射颜色, 无论是金属还是非金属, 都只放它本身的颜色- Specluar 高光贴图/高光参数对于非金属(如塑料, 陶瓷), 它的高光颜色通常是灰白色, 强度较弱对于金属, 它的高光颜色是金属本身的颜色, 强度很强- Smoothness(光滑度)控制反射的清晰度
1).仅仅将漫反射和镜面反射相加是有问题的, 结果可能会比光源更亮
2).确保材质的漫反射和镜面反射的和永远不超过1a.可以简单的将反照率色调诚意 1 - 镜面色调调整
镜面反射和漫反射已经关联, 镜面反射越强, 漫反射部分就越暗; 黑色镜面色调不会产生高光, 全部是漫反射, 白色镜面色调不会产生漫反射, 全部是镜面反射
当高光色调是灰度色时, 这种方法效果很好; 但当使用其他颜色, 会产生奇怪的结果; 例如, 红色的高光色调只会减少漫反射部分的红色分量, 漫反照会产生一个错误的效果
为了防止这种颜色现象, 我们使用高光色的最强分量来降低反照率
- Unity已经给我们准备了处理能力守恒的函数: EnergyConservationBetweenDiffuseAndSpecular需包含头文件 #include "UnityStandardUtils.cginc"- 该函数以反照率和高光色作为输入, 输出一个调整后的反照率, 第三个参数表示1 - 反射率即计算出的漫反射能量比例(Reflectivity表示反射率, 镜面反射部分所占的能量比例)
3.金属工作流
金属工作流是目前最主流, 最推荐使用的工作流, 因为它更直观, 更容易调出真实的效果a.核心思想它使用一个关键参数Metallic(金属度)来区分一个表面是金属还是非金属(绝缘体), 它是一个从0(完全非金属, 如塑料, 木头, 橡胶)到1(完全金属, 如铁, 金, 银)的滑杆b.所需贴图/参数- Albedo(反照率贴图)对于非金属, 存放的是物体本身的漫反射颜色(比如塑料的红色, 树叶的绿色)对于金属, 金属几乎不漫反射光线, 所有光线都被反射或吸收; Albedo颜色实际就是它的镜面反射颜色(比如金子的金黄色, 铜的橙红色)- Metallic(金属度贴图/参数) 若是贴图, 则为一个灰度图, 白色1表示金属部分, 黑色0表示非金属部分- Smoothness(光滑度贴图/参数) 控制表面的粗糙程度, 光滑度越高, 反射越清晰, 高光点越小; 光滑度越低, 反射越模糊, 高光点越扩散
我们可以使用另一个滑块属性作为金属开关, 来替换高光色调; 通常, 它应该设置为0或1, 介于两者之间的值表示了一种混合了金属和非金属成分的材料
金属工作流中, 我们只提供了两个主要输入:a.albedo 基础颜色b.metallic 金属度(0到1)但Shader进行光照计算时, 实际需要两个数据:a.漫反射颜色用于计算漫反射光照的部分b.高光反射颜色用于计算镜面高光的部分DiffuseAndSpecularFromMetallic负责将albeo和metallic转换成shader真正需要的 diffuseColor和specularColor
有一个细节是, 金属滑块本身应该在伽马空间中, 但是在线性空间中渲染时, unity不会对单个值进行伽马校正; 因此Gamma属性来告诉Unity也应该对我们的金属滑块应用伽马校正