目录
一、节点功能概述
采样立方体贴图节点(Sample Cubemap Node)是 Unity Shader Graph 中用于对立方体贴图(Cubemap)进行采样的核心工具。它通过输入立方体贴图资源、世界空间方向向量、采样状态和细节层级(LOD),输出对应采样点的颜色值(Vector 4),是实现环境反射、天空盒渲染、折射效果等三维环境纹理交互的基础组件。其核心优势在于:
- 精准环境采样:基于世界空间方向向量定位立方体贴图的采样点,确保反射 / 折射方向的物理正确性
- 细节层级控制:支持通过 LOD 参数调整采样精度,平衡画质与性能
- 灵活采样配置:可自定义采样状态(过滤模式、寻址模式等),适配不同视觉需求
二、端口详解
2.1 输入端口
端口名称 | 类型 | 绑定 | 描述 |
---|---|---|---|
Cube | Cubemap | 无 | 待采样的立方体贴图资源 |
Dir | Vector 3 | Normal (world space) | 世界空间中的方向向量(如反射方向、法线方向),用于定位采样点 |
Sampler | Sampler State | Default sampler state | 采样状态,控制过滤模式(如线性 / 点过滤)、寻址模式等 |
LOD | Float | 无 | 采样的 MIP 层级,值越高,纹理越模糊(细节越少) |
2.2 输出端口
端口名称 | 类型 | 描述 |
---|---|---|
Out | Vector 4 | 采样得到的颜色值(RGBA) |
三、技术原理解析
3.1 立方体贴图采样基础
立方体贴图由 6 张正交的 2D 纹理组成(对应正 / 负 X、Y、Z 轴方向),采样时需通过世界空间方向向量确定目标面和坐标:
- 方向向量分析:根据
Dir
向量的分量(x、y、z)绝对值大小,判断采样哪张面(如 x 绝对值最大则采样 X 轴方向的面) - 坐标映射:将方向向量转换为对应面的 UV 坐标,公式示例(以 X 轴正方向面为例):
- 采样执行:根据计算的 UV 坐标和 LOD 层级,从立方体贴图中读取颜色值
3.2 生成代码解析
节点的核心实现基于 HLSL 的立方体贴图采样函数,生成代码示例:
hlsl
float4 _SampleCubemap_Out = SAMPLE_TEXTURECUBE_LOD(Cubemap, Sampler, Dir, LOD);
- 函数说明:
SAMPLE_TEXTURECUBE_LOD
是 Unity 封装的立方体贴图采样函数,支持指定 LOD 层级,确保在不同距离下自动选择合适的 MIP 层级(值越高,纹理越模糊)。
3.3 LOD 参数的作用
LOD(Level of Detail)参数控制采样的 MIP 层级,影响纹理细节:
- 低 LOD 值(如 0):使用最高分辨率的 MIP 层级,细节丰富,适合近距离物体
- 高 LOD 值(如 5):使用低分辨率的 MIP 层级,细节简化,适合远距离物体或模糊效果
- 自动 LOD:若不指定 LOD,采样器会根据物体到相机的距离自动选择层级
四、应用场景与实战案例
4.1 环境反射效果
场景:金属材质的环境反射
- 需求:使金属表面反射周围环境,增强真实感
- 实现步骤:
hlsl
// 1. 获取世界空间视图方向和法线 float3 worldViewDir = normalize(WorldSpaceViewDir(vertex)); float3 worldNormal = normalize(WorldSpaceNormal(vertex)); // 2. 计算反射方向(世界空间) float3 reflectionDir = reflect(-worldViewDir, worldNormal); // 3. 采样立方体贴图(环境贴图) float4 envColor = SampleCubemapNode.Out; // Cube=环境贴图,Dir=reflectionDir // 4. 混合到金属材质 float3 metalColor = envColor.rgb * _MetallicIntensity; o.Albedo = metalColor;
4.2 天空盒渲染
场景:使用立方体贴图作为天空盒
- 步骤:
hlsl
// 1. 获取世界空间视图方向(从相机指向天空) float3 viewDir = normalize(WorldSpaceViewDir(vertex)); // 2. 采样天空盒立方体贴图 float4 skyColor = SampleCubemapNode.Out; // Cube=天空盒贴图,Dir=viewDir // 3. 输出天空颜色 o.Albedo = skyColor.rgb; o.Alpha = 1.0;
4.3 折射效果模拟
场景:玻璃材质的折射效果
- 实现:
hlsl
// 1. 计算折射方向(基于折射率IOR) float3 viewDir = normalize(WorldSpaceViewDir(vertex)); float3 normal = normalize(WorldSpaceNormal(vertex)); float3 refractionDir = refract(viewDir, normal, _IOR); // IOR=玻璃折射率(约1.5) // 2. 采样环境立方体贴图(模拟折射看到的场景) float4 refrColor = SampleCubemapNode.Out; // Cube=环境贴图,Dir=refractionDir,LOD=1(轻微模糊) // 3. 混合玻璃颜色与折射颜色 float3 glassColor = lerp(_BaseColor.rgb, refrColor.rgb, _RefractionStrength); o.Albedo = glassColor; o.Alpha = _Transparency;
五、使用技巧与注意事项
5.1 方向向量的正确性
- 世界空间要求:
Dir
端口必须输入世界空间方向向量,否则采样方向会偏离实际环境 - 反射 / 折射计算:使用
reflect
或refract
函数生成方向向量时,确保输入的视图方向和法线已转换到世界空间
5.2 采样状态配置
采样状态参数 | 推荐设置 | 应用场景 |
---|---|---|
过滤模式 | 线性过滤(Linear) | 环境反射、天空盒(平滑过渡) |
过滤模式 | 点过滤(Point) | 风格化像素效果 |
寻址模式 | clamp to Edge | 避免立方体贴图边缘出现黑边 |
5.3 LOD 参数的灵活应用
- 性能优化:对远距离物体或大面积背景,提高 LOD 值(如 3-5),减少纹理采样开销
- 模糊效果:通过手动提高 LOD 值(如
LOD = 2
),模拟反射模糊(如粗糙金属表面) - 动态调整:结合物体到相机的距离计算 LOD 值,例如:
hlsl
float distance = length(worldPos - _WorldSpaceCameraPos); float lod = saturate(distance / _MaxDistance) * _MaxLOD; // 距离越远,LOD越高
5.4 常见问题解决
- 采样方向错误:检查
Dir
向量是否为世界空间,可通过TransformDirection
节点转换空间 - 立方体贴图边缘瑕疵:确保寻址模式设为
Clamp to Edge
,并在导入设置中启用 “边缘修正” - LOD 无效:确认立方体贴图在导入设置中生成了 MIP 层级(勾选 “Generate Mip Maps”)
六、总结与拓展应用
采样立方体贴图节点通过精准的方向采样和灵活的参数控制,成为 Unity 中实现环境交互效果的核心工具,其核心价值在于:
- 真实感提升:为反射、折射等效果提供真实的环境参考,增强场景沉浸感
- 性能可控:通过 LOD 参数平衡细节与性能,适配不同硬件需求
- 创意扩展:支持风格化采样(如像素化天空盒、动态 LOD 动画)
拓展方向:
- 结合反射探针(Reflection Probe)实现局部环境的精准反射
- 在 VR 中利用双立方体贴图实现左右眼视差反射,提升立体感
- 开发基于 LOD 的动态模糊系统,模拟大气散射或运动模糊