1.非金属的光学物理导性
2.金属的光学物理导性
3.高光工作流
4.金属工作流
1.非金属的光学物理导性
当光线照射到非金属表面时, 会发生两个过程(一分为二):
1).表面反射(镜面反射)
a.比例: 很小, 通常只有2% - 5%的光会立即被反射
b.特性: 反射不会改变颜色, 保持入射光的颜色, 比如白光反射为白光, 蓝光反射为蓝光; 遵循菲涅尔效应, 反射强度随观
察角度变化, 垂直看时反射最弱, 掠射角看反射最强
c.对应的PBR参数: Smoothness(控制反射清晰度)和Specular的强度(控制反射量)
2).内部散射(漫反射)
a.比例: 大部分光线(95% - 98%)会折射进入物体内部
b.内部过程:
- 穿透表面: 光线进入材质内部
- 吸收与散射: 光线在内部的微观结构中不断反射, 穿梭
- 选择性吸收: 材质的分子结构会吸收特定波长的光; 比如苹果的色素吸收蓝色和绿色波长, 主要反射红色波长光
- 重新射出: 剩余的光线从表面的各个点随机散射出来, 形成漫反射
c.对应PBR参数: Albedo颜色, 就是材质吸收后剩余的光的颜色, 即它的"本色"
3).非金属总结: 反射 + 散射 + 内部染色
2.金属的光学物理导性
金属与非金属的光的物理特性截然不同, 其核心在于其内部有大量的自由电子
1).表面反射(镜面反射)
a.比例: 极高, 70% - 100%的光会被立即反射
b.特性: 颜色鲜明, 自由电子对不同波长光的响应不同, 导致反射光带有颜色; 同样遵循菲涅尔效应
c.对应PBR参数: 金属Albedo颜色直接定义了其反射颜色, Smoothness同样控制反射的清晰度
2).内部过程: 几乎为零
a.极速衰减: 那极少部分折射进入金属内部的光, 会瞬间被自由电子吸收并转化为热量
b.结果: 没有有效的漫反射, 光线无法进入内部并重新散射出来
3).金属总结: 几乎全部反射 + 选择性吸收 = 有色反射
3.高光工作流
高光工作流是一种传统的工作流, 现在用的相对较少, 但是在某些特定情况下能提供更精细的控制
a.核心思想: 它不区分金属和非金属, 直接指定镜面反射的颜色和强度
b.所需贴图/参数
- Albedo: 漫反射颜色
- Specular: 高光颜色和强度
- Smoothness: 光滑度(光滑度越高,高光点越集中、越清晰)
对于金属和非金属参数的解释:
a.非金属, Aldebo是物体的本色, Specular是灰白色(镜面反射很弱)
b.金属, Albedo是偏黑色(漫反射很弱), Specular是金属的本色
1).仅仅将漫反射和镜面反射相加是有问题的, 结果可能会比光源更亮(不符合能量守恒定律)


2).确保材质的漫反射和镜面反射的和永远不超过1
a.可以简单的将反照率色调乘以(1 - 镜面色调)进行调整, 镜面反射和漫反射已经建立了关联

镜面反射越强, 漫反射部分就越暗
当高光色调是灰度色(RGBA相等)时, 这种方法效果很好; 但当使用其他颜色, 会产生奇怪的结果; 例如, 红色的高光色调只
会减少漫反射部分的红色分量, 对于其他颜色通道不会产生影响; 漫反照会产生一个错误的效果

为了防止这种现象, 我们使用高光色的最强分量来降低反照率

- Unity已经给我们准备了处理能量守恒的函数: EnergyConservationBetweenDiffuseAndSpecular
需包含头文件 #include "UnityStandardUtils.cginc"
- 该函数以反照率和高光色作为输入, 输出一个调整后的漫反射值, 第三个参数表示1 - 反射率即计算出的漫反射能量比
例Reflectivity表示反射率, 镜面反射部分所占的能量比例

4.金属工作流
金属工作流是目前最主流, 最推荐使用的工作流, 因为它更直观, 更容易调出真实的效果
a.核心思想
它使用一个关键参数Metallic(金属度)来区分一个表面是金属还是非金属(绝缘体), 它是一个从0(完全非金属, 如塑料,
木头, 橡胶)到1(完全金属, 如铁, 金, 银)的滑杆
b.所需贴图/参数
- Albedo(反照率贴图)
对于非金属, 存放的是物体本身的漫反射颜色(比如塑料的红色, 树叶的绿色)
对于金属, 存放的是物体本身的镜面反射颜色(比如金子的金黄色, 铜的橙红色)
- Metallic(金属度贴图/参数)
若是贴图, 则为一个灰度图, 白色1表示金属部分, 黑色0表示非金属部分
- Smoothness(光滑度贴图/参数)
控制表面的粗糙程度, 光滑度越高, 反射越清晰, 高光点越小; 光滑度越低, 反射越模糊, 高光点越扩散
Metallic参数就像一个开关:
a.Metallic = 0, Albedo用作漫反射, 高光使用(0.04, 0.04, 0.04)
b.Metallic = 1, Albedo用作高光颜色, 漫反射颜色压暗甚至接近黑色
我们可以使用另一个滑块属性作为金属开关, 来替换高光色调; 通常, 它应该设置为0或1, 介于两者之间的值表示了一种混
合了金属和非金属成分的材料

金属工作流中, 我们只提供了两个主要输入:
a.albedo 基础颜色
b.metallic 金属度(0到1)
但Shader进行光照计算时, 实际需要两个数据:
a.漫反射颜色用于计算漫反射光照的部分
b.高光反射颜色用于计算镜面高光的部分
DiffuseAndSpecularFromMetallic负责将albeo和metallic转换成shader真正需要的 diffuseColor和specularColor
有一个细节是, 金属滑块本身应该在伽马空间中, 但是在线性空间中渲染时, unity不会对单个值进行伽马校正; 因此Gamma
属性来告诉Unity也应该对我们的金属滑块应用伽马校正

1).上面我们仅仅考虑的是将参数进行守恒
a.EnergyConservationBetweenDiffuseAndSpecular
强制让漫反射颜色衰减, 使其与高光颜色的能量强度之和不超过1
b.DiffuseAndSpecularFromMetallic
根据金属度属性, 正确地分配入射能量到反射和漫反射两部分
2).Unity已经给我们提供了实现了完整PBR光照模型的函数UNITY_BRDF_PBS


1262

被折叠的 条评论
为什么被折叠?



