目录
一、节点功能概述
采样反射立方体贴图节点(Sample Reflected Cubemap Node)是 Unity Shader Graph 中专为环境反射效果设计的高效工具。它通过输入立方体贴图资源、对象空间视图方向、对象空间法线、采样状态和细节层级(LOD),自动计算反射方向并采样立方体贴图,输出对应颜色值(Vector 4)。该节点简化了反射效果的实现流程,适用于金属、镜面、光滑塑料等需要环境反射的材质。其核心优势在于:
- 反射方向自动计算:内置
reflect
函数,无需手动推导反射向量,降低开发复杂度 - 对象空间适配:直接接收对象空间的视图方向和法线,减少空间转换步骤
- 灵活可控的反射效果:支持通过 LOD 和采样状态调整反射清晰度,平衡真实感与性能
二、端口详解
2.1 输入端口
端口名称 | 类型 | 绑定 | 描述 |
---|---|---|---|
Cube | Cubemap | 无 | 待采样的立方体贴图资源(如环境贴图、反射探针) |
View Dir | Vector 3 | View Direction (object space) | 对象空间中的视图方向向量(从顶点指向相机) |
Normal | Vector 3 | Normal (object space) | 对象空间中的顶点法线向量,用于计算反射方向 |
Sampler | Sampler State | Default sampler state | 采样状态,控制过滤模式(线性 / 点过滤)、寻址模式等 |
LOD | Float | 无 | 采样的 MIP 层级,值越高,反射效果越模糊 |
2.2 输出端口
端口名称 | 类型 | 描述 |
---|---|---|
Out | Vector 4 | 采样得到的反射颜色值(RGBA) |
三、技术原理解析
3.1 反射方向计算逻辑
节点的核心功能是通过视图方向和法线自动计算反射方向,生成代码示例解析:
hlsl
float4 _SampleCubemap_Out = SAMPLE_TEXTURECUBE_LOD(Cubemap, Sampler, reflect(-ViewDir, Normal), LOD);
-
反射向量公式: 利用 HLSL 的
reflect
函数计算反射方向,公式为:\(\text{反射方向} = \text{reflect}(-\text{ViewDir}, \text{Normal})\) 其中,负号用于修正视图方向的方向(将 “从顶点到相机” 转换为 “从相机到顶点”)。 -
空间转换说明: 虽然输入的
View Dir
和Normal
为对象空间,但reflect
函数计算后,反射方向会自动适配立方体贴图的世界空间采样需求(立方体贴图的采样方向需为世界空间)。
3.2 与普通采样立方体贴图节点的差异
特性 | 采样反射立方体贴图节点 | 普通采样立方体贴图节点(Sample Cubemap Node) |
---|---|---|
反射方向处理 | 内置reflect 函数,自动计算反射方向 | 需手动输入反射方向向量 |
输入空间要求 | 接收对象空间的视图方向和法线 | 需输入世界空间的采样方向 |
适用场景 | 快速实现标准反射效果(如镜面、金属) | 灵活适配各种方向采样(如折射、自定义方向) |
四、应用场景与实战案例
4.1 金属材质反射
场景:不锈钢材质的环境反射效果
- 需求:使金属表面反射周围环境,且反射清晰度随粗糙度变化
- 实现步骤:
hlsl
// 1. 获取对象空间视图方向和法线(通过节点直接输入) // View Dir = Object Space View Direction Node.Out // Normal = Object Space Normal Node.Out // 2. 采样反射立方体贴图(LOD随粗糙度提高而增大) float lod = _Roughness * _MaxLOD; // 粗糙度越高,反射越模糊 float4 reflectedColor = SampleReflectedCubemapNode.Out; // LOD=lod // 3. 应用金属材质(反射颜色作为基础色) o.Albedo = reflectedColor.rgb * _MetallicTint; o.Metallic = 1.0; o.Roughness = _Roughness;
4.2 镜面反射效果
场景:光滑镜面的精准环境反射
- 步骤:
hlsl
// 1. 确保视图方向和法线为对象空间(直接连接对应节点) // View Dir = Object View Direction Node // Normal = Object Normal Node // 2. 采样反射立方体贴图(低LOD确保高清晰度) float4 mirrorColor = SampleReflectedCubemapNode.Out; // LOD=0 // 3. 混合镜面颜色(可添加轻微高光) float3 finalColor = mirrorColor.rgb + _SpecularIntensity * _LightColor; o.Albedo = finalColor; o.Alpha = 1.0;
4.3 半透明材质反射
场景:磨砂玻璃的弱反射效果
- 实现:
hlsl
// 1. 计算反射颜色(高LOD实现模糊反射) float blurLod = 3.0; // 固定模糊层级 float4 reflected = SampleReflectedCubemapNode.Out; // LOD=blurLod // 2. 混合玻璃基础色与反射色 float3 glassColor = lerp(_BaseColor.rgb, reflected.rgb, _ReflectStrength); // 3. 应用半透明效果 o.Albedo = glassColor; o.Alpha = _Transparency;
五、使用技巧与注意事项
5.1 空间转换注意事项
- 输入空间正确性:确保
View Dir
和Normal
端口输入的是对象空间数据,若使用世界空间数据,需通过TransformDirection
节点转换为对象空间:hlsl
float3 objectViewDir = TransformDirection(worldViewDir, WorldToObject); // 世界→对象空间
5.2 LOD 与反射清晰度控制
LOD 值范围 | 反射效果特点 | 适用场景 |
---|---|---|
0-1 | 高清晰度,细节丰富 | 镜面、抛光金属等光滑表面 |
2-4 | 中等模糊,细节适中 | 磨砂金属、光滑塑料 |
5+ | 高模糊,细节极少 | 粗糙表面、远距离物体的反射 |
5.3 采样状态优化
- 过滤模式选择:
- 线性过滤(Linear):反射过渡平滑,适合大多数真实感材质
- 点过滤(Point):反射边缘锐利,适合风格化像素效果
- 寻址模式:建议设为
Clamp to Edge
,避免立方体贴图边缘出现黑边或重复纹理
5.4 性能优化策略
- LOD 动态调整:结合物体到相机的距离计算 LOD,例如:
hlsl
float distance = length(worldPos - _WorldSpaceCameraPos); float autoLod = saturate(distance / _LODDistanceThreshold) * _MaxLOD;
- 反射探针烘焙:使用反射探针(Reflection Probe)烘焙环境立方体贴图,减少实时计算开销
六、总结与拓展应用
采样反射立方体贴图节点通过自动化反射方向计算,为开发者提供了便捷高效的环境反射实现方案,其核心价值在于:
- 简化工作流:省去手动推导反射向量的步骤,降低反射效果的实现门槛
- 效果可控:通过 LOD 和采样状态精准调整反射清晰度,平衡视觉效果与性能
- 兼容性强:支持内置渲染管线、URP 和 HDRP,适配各类项目需求
拓展方向:
- 结合粗糙度贴图动态控制 LOD,实现基于像素级粗糙度的反射变化
- 与折射效果结合,模拟半透明材质的反射 + 折射复合效果(如玻璃)
- 在 VR 中利用双立方体贴图和该节点,实现左右眼独立的立体反射效果