CustomLighting 节点是 Unity URP Shader Graph 中一个功能强大的复合节点,专门用于构建自定义的 PBR(基于物理的渲染)光照模型。该节点为开发者提供了一个灵活且高效的框架,能够通过节点连接的方式生成符合物理规律的光照效果,同时保持优异的性能表现。
在当前的实时渲染领域,PBR 已经成为行业标准,它能够模拟光线与材质之间复杂的相互作用,产生更加真实和一致的视觉效果。CustomLighting 节点的设计理念就是让开发者能够在不需要编写复杂着色器代码的情况下,快速实现高质量的 PBR 材质效果。
该节点的核心价值在于其平衡了易用性与灵活性。对于不熟悉底层着色器编程的艺术家和技术美术来说,通过可视化的节点连接就能创建出专业级的光照效果;而对于有经验的图形程序员,它提供了足够的扩展空间来实现特殊的光照模型。
节点技术特性详解
复合节点架构分析
CustomLighting 节点作为复合节点,其内部封装了完整的 PBR 光照计算流程。复合节点的设计意味着它内部包含了多个子节点的组合,这些子节点协同工作,共同完成复杂的光照计算任务。这种架构的优势在于:
- 计算效率优化:节点内部的计算流程经过精心优化,确保在移动设备和性能受限的平台上也能流畅运行
- 参数统一管理:所有相关的 PBR 参数都集中在单个节点中管理,便于材质属性的统一调整
- 接口标准化:提供了标准化的输入输出接口,确保与其他 Shader Graph 节点的兼容性
PBR 光照模型基础
CustomLighting 节点实现的 PBR 模型基于经典的微表面理论,该理论假设物体表面由无数个微小的镜面组成,每个微表面都会对光线产生反射。节点的计算涵盖了以下几个关键方面:
- 能量守恒:确保反射光线的总能量不会超过入射光线的能量,这是 PBR 模型的核心原则
- 菲涅尔效应:模拟不同角度观察时反射率的变化,在掠射角时反射更加明显
- 微表面分布:使用 GGX 或 Beckmann 分布函数来描述表面粗糙度对高光的影响
- 几何遮蔽:考虑微表面之间的相互遮蔽对光线传播的影响
输入端口深度解析
Albedo 输入端口
Albedo(反照率)是 PBR 材质系统中最为基础的参数,它定义了材质表面对光线的漫反射特性。在物理意义上,Albedo 表示的是材质表面对不同波长光线的反射能力。
技术特性说明:
- 数据类型:Vector 3,对应 RGB 颜色空间
- 数值范围:建议使用 0-1 的线性颜色值,而非 sRGB
- 物理意义:表示材质在完美漫反射条件下的基础颜色
最佳实践建议:
- 避免使用过亮或过饱和的颜色值,真实世界材质的 Albedo 值通常在 0.02-0.8 之间
- 金属材质的 Albedo 应该接近黑色或非常暗的颜色,因为金属主要通过镜面反射表现
- 对于非金属材质,Albedo 应该包含材质的固有颜色信息
实际应用示例:
ini
// 创建基础 Albedo 纹理采样
AlbedoTexture = SampleTexture2D(AlbedoMap, UV);
// 应用色调调整
AdjustedAlbedo = AlbedoTexture * BaseColor;
// 确保数值在合理范围内
FinalAlbedo = clamp(AdjustedAlbedo, 0.0, 1.0);
Metallic 输入端口
Metallic(金属度)参数控制材质的导电特性,这是区分金属和非金属材质的关键参数。在 PBR 工作流中,金属度是一个二元性很强的参数。
技术实现细节:
- 数据类型:Float,单精度浮点数
- 数值范围:0.0(完全非金属)到 1.0(完全金属)
- 物理基础:基于材质的电导率特性
金属度对材质的影响:
- 当 Metallic = 1.0 时:
- Albedo 颜色主要影响镜面反射颜色
- 漫反射分量几乎为零
- 菲涅尔反射强度达到最大值
- 当 Metallic = 0.0 时:
- Albedo 颜色影响漫反射颜色
- 镜面反射颜色由入射光决定
- 菲涅尔效应较弱
纹理制作要点:
- 金属度贴图通常是灰度图,白色表示金属区域,黑色表示非金属区域
- 在边界区域可以使用中间值实现平滑过渡
- 真实世界中很少有完全中性的金属度值,大多数材质要么是金属要么是非金属
Smoothness 输入端口
Smoothness(光滑度)参数控制材质表面的微观粗糙程度,直接影响高光反射的集中程度和范围。
技术参数说明:
- 数据类型:Float,单精度浮点数
- 数值范围:0.0(完全粗糙)到 1.0(完全光滑)
- 对应关系:与粗糙度(Roughness)是倒数关系
光滑度的视觉效果影响:
- 高光滑度(接近 1.0):
- 产生小而明亮的高光点
- 反射图像更加清晰
- 适合表现抛光金属、玻璃等光滑表面
- 低光滑度(接近 0.0):
- 产生大而柔和的高光区域
- 反射图像模糊不清
- 适合表现粗糙表面如混凝土、布料等
纹理制作技巧:
- 光滑度贴图需要注意与法线贴图的协调性
- 磨损区域通常具有较低的光滑度值
- 不同材质类型有其典型的光滑度范围值
NormalMap 输入端口
NormalMap(法线贴图)是现代实时渲染中不可或缺的技术,它通过改变表面法线方向来模拟复杂的几何细节,而不需要增加实际的多边形数量。
技术规格:
- 数据类型:Vector 3,对应世界空间法线方向
- 坐标空间:世界空间(World Space)
- 数值范围:各分量通常在 [-1, 1] 范围内
法线贴图的工作流程:
- 切线空间到世界空间的转换
- 法线向量的归一化处理
- 与基础法线的混合计算
制作和使用建议:
- 确保法线贴图使用正确的色彩空间(通常是线性空间)
- 注意法线贴图的压缩设置,避免使用有损压缩
- 在连接法线贴图前通常需要进行 UnpackNormal 操作
Occlusion 输入端口
Occlusion(环境光遮蔽)贴图用于模拟全局光照中的遮蔽效果,增强场景的空间感和深度感。
技术作用:
- 模拟环境光在凹槽和裂缝中的衰减
- 增强材质的体积感和真实感
- 弥补实时全局光照的不足
使用注意事项:
- 环境光遮蔽通常作为乘数应用于间接光照部分
- 不影响直接光照计算
- 数值范围通常在 0.0(完全遮蔽)到 1.0(无遮蔽)之间
输出端口与渲染流程集成
输出特性分析
CustomLighting 节点的输出端口提供经过完整 PBR 计算后的颜色信息,这个输出可以直接用于片元着色器的发射(Emission)通道。
输出数据类型: Vector 3,表示 RGB 颜色值
使用场景: 主要用于 Fragment 阶段的 Emission 输入
渲染管线集成
在 URP 渲染管线中,CustomLighting 节点的输出需要正确集成到渲染流程中:
ini
// 简化的渲染流程示意
FragmentOutput frag (VertexOutput input)
{
// 基础颜色计算
float4 baseColor = CalculateBaseColor(input);
// CustomLighting 节点计算
float3 lightingResult = CustomLightingFunction(
input.albedo,
input.metallic,
input.smoothness,
input.normal,
input.occlusion
);
// 最终颜色合成
FragmentOutput output;
output.Emission = lightingResult;
output.Albedo = baseColor.rgb;
return output;
}
性能优化与质量设置
Shading Quality 配置
CustomLighting 节点的性能和质量可以通过 Shading Quality 设置进行精细调整:
Receive Global Illumination 设置:
- 设置为 Off 时,节点不接收动态全局光照
- 减少实时光照计算开销
- 适用于移动平台或性能敏感的场景
Diffuse Quality 设置:
- 设置为 None 时禁用高级漫反射计算
- 使用简化的漫反射模型
- 显著提升渲染性能
Specular Quality 设置:
- 设置为 None 时禁用复杂高光计算
- 使用基本的高光反射模型
- 适用于对性能要求极高的场景
平台适配策略
不同平台需要不同的质量设置策略:
- 高端 PC/主机平台:
- 可以使用完整的 PBR 计算
- 开启所有高级光照特性
- 使用高质量的法线和反射计算
- 移动平台优化:
- 适当降低计算精度
- 使用简化版的光照模型
- 减少实时计算依赖
实际应用案例与工作流
金属材质创建实例
让我们通过一个具体的金属材质案例来演示 CustomLighting 节点的完整使用流程:
材质需求: 创建带有磨损效果的黄铜材质
制作步骤:
-
准备基础纹理:
- Albedo 贴图:暗黄色的基础颜色,磨损处露出底层材质
- Metallic 贴图:主体区域为白色(金属),磨损处为黑色(非金属)
- Smoothness 贴图:主体高光滑度,磨损处低光滑度
- Normal 贴图:表现表面划痕和磨损细节
- Occlusion 贴图:增强凹槽处的深度感
-
节点图连接:
css[Texture Samplers] → [CustomLighting Node] → [Fragment Emission] ↓ [Additional Effects] → [Final Output] -
参数调整要点:
- 金属度:0.9(高金属性)
- 光滑度:0.7(适度抛光)
- 法线强度:根据实际效果微调
非金属材质实例
材质需求: 创建真实的陶瓷材质
特性分析:
- 高光滑度但非金属
- 清晰的镜面反射
- 白色的基础颜色
参数设置:
- Albedo:接近白色的浅色调
- Metallic:0.0(完全非金属)
- Smoothness:0.9(高度光滑)
- Normal:轻微的表面不规则性
高级技巧与故障排除
常见问题解决方案
问题1:材质看起来过于平淡
- 检查法线贴图是否正确连接和采样
- 确认环境光遮蔽贴图是否发挥作用
- 调整金属度和光滑度的对比度
问题2:性能开销过大
- 降低 Shading Quality 设置
- 检查纹理分辨率和压缩格式
- 考虑使用 LOD 技术动态调整质量
问题3:光照不自然
- 验证法线空间转换是否正确
- 检查所有输入参数是否在合理范围内
- 确认光照环境设置是否适合 PBR 材质
进阶应用技巧
混合材质实现:
通过多个 CustomLighting 节点的混合,可以实现复杂的材质效果:
ini
// 混合两个不同的光照计算结果
float3 material1 = CustomLighting1(...);
float3 material2 = CustomLighting2(...);
float blendFactor = CalculateBlendFactor(...);
float3 finalLighting = lerp(material1, material2, blendFactor);
动态效果集成:
结合时间节点和数学运算,可以实现动态的材质效果:
- 金属表面的氧化效果
- 潮湿表面的干湿变化
- 温度引起的热变色效果
总结与最佳实践
CustomLighting 节点是 Unity URP Shader Graph 中实现高质量 PBR 材质的关键工具。通过深入理解每个输入参数的物理意义和技术特性,开发者可以创建出既真实又性能优异的材质效果。
核心要点回顾:
- 正确理解 PBR 工作流的物理基础
- 合理设置各个输入参数的数值范围
- 根据目标平台调整质量设置
- 充分利用节点的复合特性实现复杂效果
未来发展趋势:
随着硬件能力的提升和渲染技术的发展,CustomLighting 节点可能会集成更多先进的光照模型特性,如光线追踪、实时光线传播等。保持对新技术的学习和适应,将有助于在未来的项目中创造出更加出色的视觉效果。
【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)