目录
一、节点功能概述
采样 2D 纹理节点(Sample Texture 2D Node)是 Unity Shader Graph 中用于对 2D 纹理进行采样的基础且核心的工具。它通过输入 2D 纹理资源、UV 坐标和采样状态,输出对应采样点的颜色值(包括 RGBA 四通道及单独通道),适用于几乎所有需要纹理数据的渲染场景(如基础颜色、法线映射、粗糙度贴图等)。其核心优势在于:
- 多通道输出:同时提供 RGBA 复合值和单独的 R、G、B、A 通道值,满足不同材质属性需求
- 纹理类型适配:支持普通纹理和法线贴图两种模式,自动处理法线解码
- 灵活可控:可自定义 UV 坐标和采样状态,适配各种纹理映射需求
二、端口详解
2.1 输入端口
端口名称 | 类型 | 绑定 | 描述 |
---|---|---|---|
Texture | Texture 2D | 无 | 待采样的 2D 纹理资源(如 diffuse 贴图、法线图) |
UV | Vector 2 | UV | 采样点的 UV 坐标,用于定位纹理上的像素 |
Sampler | Sampler State | Default sampler state | 采样状态,控制过滤模式(如线性 / 点过滤)、寻址模式(如重复 / 钳位)等 |
2.2 输出端口
端口名称 | 类型 | 描述 |
---|---|---|
RGBA | Vector 4 | 采样得到的颜色值(包含 RGBA 四通道) |
R | Float | 红色通道(x 分量)值 |
G | Float | 绿色通道(y 分量)值 |
B | Float | 蓝色通道(z 分量)值 |
A | Float | alpha 通道(w 分量)值 |
三、控制参数详解
3.1 核心参数
参数名称 | 类型 | 选项 | 描述 |
---|---|---|---|
Type | Dropdown | Default(默认)、Normal(法线) | 选择纹理类型: - Default:用于普通纹理(如漫反射、粗糙度) - Normal:用于法线贴图,自动解码法线数据 |
Space | Dropdown | Tangent(切线空间)、Object(对象空间) | 仅当 Type 为 Normal 时生效,指定法线贴图的空间: - Tangent:切线空间法线(最常用,与模型表面贴合) - Object:对象空间法线(适用于整体形状的法线定义) |
Enable Global Mip Bias | Toggle | On(开启)、Off(关闭) | 开启时应用运行时自动全局 MIP 偏移(用于动态分辨率缩放时提升细节重建质量) |
四、技术原理解析
4.1 采样逻辑
节点通过 HLSL 的SAMPLE_TEXTURE2D
函数实现纹理采样,根据纹理类型自动处理数据,生成代码示例解析如下:
4.1.1 默认纹理模式(Default)
hlsl
// 采样纹理并获取RGBA值
float4 _SampleTexture2D_RGBA = SAMPLE_TEXTURE2D(Texture, Sampler, UV);
// 提取各通道值
float _SampleTexture2D_R = _SampleTexture2D_RGBA.r;
float _SampleTexture2D_G = _SampleTexture2D_RGBA.g;
float _SampleTexture2D_B = _SampleTexture2D_RGBA.b;
float _SampleTexture2D_A = _SampleTexture2D_RGBA.a;
- 适用场景:漫反射贴图、粗糙度贴图、金属度贴图等无需解码的纹理,直接使用采样的原始通道值。
4.1.2 法线贴图模式(Normal)
hlsl
// 采样法线贴图
float4 _SampleTexture2D_RGBA = SAMPLE_TEXTURE2D(Texture, Sampler, UV);
// 解码法线数据(将RG或AG通道转换为三维法线向量)
_SampleTexture2D_RGBA.rgb = UnpackNormalmapRGorAG(_SampleTexture2D_RGBA);
// 提取各通道值(此时RGB为法线向量的x、y、z分量)
float _SampleTexture2D_R = _SampleTexture2D_RGBA.r;
float _SampleTexture2D_G = _SampleTexture2D_RGBA.g;
float _SampleTexture2D_B = _SampleTexture2D_RGBA.b;
float _SampleTexture2D_A = _SampleTexture2D_RGBA.a;
- 法线解码原理:法线贴图存储时通常将法线向量的 x(R)和 y(G)分量压缩到 0-1 范围,z 分量通过计算得出(
z = sqrt(1 - x² - y²)
),UnpackNormalmapRGorAG
函数负责完成这一解码过程。
4.2 采样状态的影响
采样状态(Sampler State)的核心参数对采样结果的影响:
- 过滤模式(Filter Mode):
- 点过滤(Point):采样像素不插值,纹理边缘锐利(性能高,适合像素风格)
- 线性过滤(Linear):采样相邻像素并插值,过渡平滑(画质好,常用)
- 寻址模式(Address Mode):
- 重复(Repeat):UV 超出 [0,1] 范围时重复纹理(适合平铺纹理)
- 钳位(Clamp):UV 超出范围时取边缘像素(适合非平铺纹理,避免边缘拉伸)
五、应用场景与实战案例
5.1 漫反射纹理采样
场景:基础材质的漫反射颜色
- 需求:将纹理的 RGB 通道作为材质的基础颜色
- 实现:
hlsl
// 采样漫反射纹理(Type设为Default) float4 albedoMap = SampleTexture2DNode.RGBA; // 应用基础颜色 o.Albedo = albedoMap.rgb; o.Alpha = albedoMap.a; // 若纹理带透明通道
5.2 法线贴图应用
场景:通过法线贴图增强表面细节
- 步骤:
hlsl
// 采样法线贴图(Type设为Normal,Space设为Tangent) float3 tangentNormal = SampleTexture2DNode.RGB; // 解码后的切线空间法线 // 将切线空间法线转换到世界空间 float3 worldNormal = TransformTangentToWorld(tangentNormal, tangentToWorld); // 应用到光照计算 o.Normal = worldNormal;
5.3 粗糙度与金属度控制
场景:使用纹理的通道存储材质属性
- 实现:
hlsl
// 采样纹理(R通道存储粗糙度,G通道存储金属度) float roughness = SampleTexture2DNode.R; float metallic = SampleTexture2DNode.G; // 应用到PBR材质 o.Roughness = roughness * _RoughnessScale; o.Metallic = metallic * _MetallicScale;
5.4 透明纹理效果
场景:树叶、玻璃等半透明材质
- 实现:
hlsl
// 采样带透明通道的纹理 float4 textureColor = SampleTexture2DNode.RGBA; // 应用颜色和透明度 o.Albedo = textureColor.rgb * _Tint; o.Alpha = textureColor.a * _Transparency;
六、使用技巧与注意事项
6.1 纹理类型与参数匹配
纹理类型 | Type 设置 | Space 设置 | 常见用途 |
---|---|---|---|
漫反射、高光 | Default | 无 | 基础颜色、高光强度 |
法线贴图 | Normal | Tangent | 表面细节(如木纹、布料纹理) |
粗糙度、金属度 | Default | 无 | PBR 材质属性控制 |
遮罩贴图 | Default | 无 | 控制材质局部效果(如区域高光) |
6.2 UV 坐标调整技巧
-
平铺与偏移:通过 UV 节点调整 UV 坐标,实现纹理的缩放和位移:
hlsl
float2 scaledUV = uv * _Tile + _Offset; // 缩放平铺并偏移 float4 tiledColor = SampleTexture2DNode.RGBA; // 使用调整后的UV采样
-
动画 UV:通过时间动态偏移 UV,实现纹理流动效果(如流水、火焰):
hlsl
float2 animatedUV = uv + _FlowSpeed * _Time.y; float4 flowColor = SampleTexture2DNode.RGBA; // 使用动画UV采样
6.3 性能优化建议
- 压缩纹理:对非关键纹理使用合适的压缩格式(如 ETC2、ASTC),减少内存占用和采样开销
- MIP 映射:开启纹理的 MIP 映射(导入设置中勾选 Generate Mip Maps),配合线性过滤提升远处画质
- 通道复用:将多个属性存储在一张纹理的不同通道(如粗糙度 + 金属度),减少采样次数
七、总结与拓展应用
采样 2D 纹理节点作为 Shader Graph 中最基础的纹理操作工具,其核心价值在于:
- 材质基础:为几乎所有材质提供纹理数据输入,是视觉效果的基石
- 灵活性:通过参数调整适配不同纹理类型和采样需求
- 性能可控:结合采样状态和纹理设置,平衡画质与性能
拓展方向:
- 结合 UV 动画实现动态纹理效果(如旗帜飘动、水面流动)
- 利用纹理通道混合实现复杂材质(如多层纹理叠加)
- 配合 LOD 节点动态调整纹理采样精度,优化大规模场景性能