描述
Sample Texture 2D 节点是 Unity Shader Graph 中最为基础和重要的节点之一,它承担着从二维纹理资源中获取颜色信息的核心功能。在实时渲染管线中,纹理采样是着色器编程中最频繁执行的操作之一,几乎所有的材质效果都离不开纹理采样。该节点通过接收 UV 坐标作为输入,从指定的 Texture 2D 资源中提取对应的颜色数据,并以 Vector 4 的形式返回完整的 RGBA 颜色值。
纹理采样的过程本质上是一个坐标映射过程:UV 坐标系统将二维纹理空间与三维模型表面建立对应关系,使得纹理能够正确地包裹在模型表面。Sample Texture 2D 节点不仅支持基础的纹理采样,还提供了丰富的配置选项,包括采样器状态设置、mipmap 级别控制以及法线贴图处理等高级功能。
对于法线贴图的处理,Sample Texture 2D 节点提供了专门的配置选项。法线贴图是一种常用的凹凸映射技术,它通过改变表面法线方向来模拟复杂的几何细节,而无需增加模型的实际多边形数量。节点支持切线空间和对象空间两种法线贴图格式,分别适用于动态变形模型和静态不变形模型。
Note
在 Shader Graph 的早期版本中,当 Sample Texture 2D 节点与自定义函数节点或子图节点结合使用时,偶尔会出现纹理采样错误的问题。这些错误通常与着色器编译器的优化策略有关。从 Shader Graph 10.3 版本开始,Unity 团队对纹理采样机制进行了重要改进,显著提升了节点的稳定性和兼容性。如果遇到此类问题,建议升级到 10.3 或更高版本。
创建节点菜单类别
在 Shader Graph 的创建节点菜单中,Sample Texture 2D 节点位于 Input -> Texture 分类下。这个分类包含了所有与纹理输入相关的节点,如 Sample Texture 2D Array、Sample Texture 3D 等。用户可以通过右键点击图表空白区域,从弹出菜单中选择相应分类来快速找到并添加该节点。
除了通过菜单添加,用户还可以使用快捷键或搜索功能快速定位节点。在图表窗口中按下空格键会打开节点搜索面板,输入"Sample Texture 2D"即可快速找到并添加该节点。
兼容性
Sample Texture 2D 节点在 Unity 的各个渲染管线中都具有良好的兼容性,这确保了着色器资产在不同项目间的可移植性。
| 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) |
|---|---|---|
| 是 | 是 | 是 |
在默认配置下,Sample Texture 2D 节点设计用于 Shader Graph 的片段着色器 阶段。这是因为纹理采样操作通常与像素级别的颜色计算密切相关。然而,通过调整节点的 Mip 采样模式 设置,用户也可以在顶点着色器阶段使用该节点进行纹理采样。这种灵活性为特殊效果的实现提供了可能,比如在顶点阶段基于纹理数据调整顶点位置。
需要注意的是,在不同渲染管线中使用该节点时,某些高级功能可能会有细微的行为差异。例如,HDRP 中对纹理格式和色彩空间的处理可能与 URP 有所不同。在跨管线移植着色器时,建议进行充分的测试以确保视觉效果的一致性。
输入

Sample Texture 2D 节点的输入端口设计考虑了纹理采样过程中可能需要的各种参数,从基础的纹理资源和 UV 坐标到高级的采样控制选项。
| 名称 | 类型 | 绑定 | 描述 |
|---|---|---|---|
| Texture | Texture 2D | 无 | 指定要采样的 Texture 2D 资源。这是节点的核心输入,决定了采样操作的源数据。用户可以直接从项目资源中拖拽纹理资源到此端口,或在节点的检视面板中手动指定。 |
| UV | Vector 2 | UV | 定义采样位置的二维坐标。UV 坐标的范围通常是[0,1],但也可以通过平铺和偏移设置超出此范围。如果未连接此输入,节点将使用网格默认的 UV 坐标。 |
| Sampler | Sampler State | 默认采样器状态 | 控制采样行为的设置集合,包括滤波模式和寻址模式。通过 Sampler State 节点可以创建自定义采样器,实现特定的采样效果。 |
| LOD | Float | LOD | 指定采样时使用的具体 mip 级别。此输入仅在 Mip 采样模式 设置为 LOD 时可见,允许精确控制纹理的细节级别。 |
| Bias | Float | 偏移(Bias) | 调整自动计算的 mip 级别的偏移量。此输入仅在 Mip 采样模式 设置为 Bias 时可见,正值偏向较低分辨率 mip,负值偏向较高分辨率 mip。 |
| DDX | Float | DDY | 提供手动计算的 x 方向导数,用于梯度采样模式下的 mip 计算。此输入仅在 Mip 采样模式 设置为 Gradient 时可见。 |
| DDY | Float | DDY | 提供手动计算的 y 方向导数,用于梯度采样模式下的 mip 计算。此输入仅在 Mip 采样模式 设置为 Gradient 时可见。 |
Texture 输入是节点的必需输入,如果没有指定有效的纹理资源,节点将无法正常工作。在 Shader Graph 中,纹理资源可以通过多种方式指定:既可以在节点检视面板中直接分配,也可以通过材质参数暴露给材质检视器,实现运行时动态更换纹理。
UV 输入的灵活性是 Sample Texture 2D 节点的强大特性之一。用户可以通过连接各种 UV 处理节点来创建复杂的 UV 映射效果,如 UV 平铺、旋转、扭曲等。常见的 UV 处理技术包括:
- 使用 Time 节点创建动态 UV 动画
- 使用 Tiling And Offset 节点实现纹理重复和偏移
- 使用 Triplanar 投影实现无接缝的三平面纹理映射
- 使用 Parallax Occlusion Mapping 创建视差效果
Sampler 输入允许用户精细控制采样行为。Unity 提供了预定义的采样器状态,也支持通过 Sampler State 节点创建自定义采样器。采样器状态主要控制两个方面的行为:
- 滤波模式(Filter Mode):决定在纹理放大缩小时如何插值像素,包括 Point、Bilinear 和 Trilinear 模式
- 寻址模式(Wrap Mode):定义当 UV 坐标超出[0,1]范围时的行为,包括 Repeat、Clamp 和 Mirror 模式
LOD、Bias、DDX 和 DDY 输入提供了对 mipmap 系统的精细控制。mipmap 是纹理的预先计算的多分辨率版本,用于提高渲染效率和减少锯齿现象。这些高级输入使得用户可以根据具体需求优化纹理的 mipmap 使用策略。
控件
Sample Texture 2D 节点的控件面板提供了对采样行为的直观配置选项,用户无需编写代码即可实现复杂的纹理处理功能。
| 名称 | 类型 | 描述 | |
|---|---|---|---|
| Type | 下拉菜单 | 选择纹理的语义类型,决定节点如何处理采样结果 | |
| Default | 标准颜色纹理模式,节点直接输出纹理的原始颜色值 | ||
| Normal | 法线贴图模式,节点会对采样结果进行法线解包处理 | ||
| Space | 下拉菜单 | 当 Type 设置为 Normal 时,选择法线贴图的空间坐标系 | |
| Tangent | 切线空间法线贴图,法线方向相对于顶点法线和切线。适用于会变形的模型,如动画角色 | ||
| Object | 对象空间法线贴图,法线方向在模型局部坐标系中定义。适用于静态不变形模型 |
Type 控件 是节点最重要的配置选项之一,它决定了节点如何解释和处理纹理数据。当设置为 Default 时,节点将纹理视为普通的颜色纹理,直接输出采样得到的 RGBA 值。这种模式适用于漫反射贴图、高光贴图、发射贴图等颜色纹理。
当 Type 设置为 Normal 时,节点会执行特殊的法线解包操作。这是因为法线贴图通常以压缩格式存储,需要特定的解包函数才能还原为正确的法线向量。Unity 支持两种主要的法线贴图压缩格式:DXTC5nm(DXT5nm)和 BC5(BC5),节点会自动根据纹理格式选择正确的解包方法。
Space 控件 仅在法线贴图模式下可用,它决定了法线向量的参考坐标系。Tangent 空间是游戏开发中最常用的法线贴图空间,它的主要优势包括:
- 可重用性:同一张切线空间法线贴图可以应用于不同的模型部位
- 支持变形:适用于蒙皮动画和顶点变形的模型
- 一致性:在不同 LOD 级别间保持一致的视觉效果
Object 空间法线贴图在某些特定场景下具有优势:
- 性能优化:对象空间法线不需要每像素的切线空间计算
- LOD 一致性:在不同细节级别间保持精确的法线方向
- 特定效果:适用于需要绝对法线方向的特效
选择正确的法线空间对于视觉效果的正确性至关重要。一般来说,对于动态角色和复杂模型推荐使用切线空间法线,对于静态环境和简单道具可以考虑使用对象空间法线。
其他节点设置
Sample Texture 2D 节点的检视面板中还提供了一系列高级设置,这些设置控制着节点的底层采样行为和性能特性。
| 名称 | 类型 | 描述 | |
|---|---|---|---|
| Use Global Mip Bias | 切换 | 控制是否使用渲染管线的全局 mip 偏差设置 | |
| Enabled | 节点采样时会结合全局 mip 偏差和可能的局部偏差值 | ||
| Disabled | 节点仅使用局部偏差设置或完全不用偏差 | ||
| Mip Sampling Mode | 下拉菜单 | 选择 mip 级别计算的策略和方法 | |
| Standard | 由渲染管线自动计算合适的 mip 级别 | ||
| LOD | 允许手动指定具体的 mip 级别 | ||
| Gradient | 使用自定义的导数计算 mip 级别 | ||
| Bias | 在自动计算的 mip 级别基础上应用偏差调整 |
Use Global Mip Bias 设置与纹理流送系统和动态分辨率渲染等技术密切相关。全局 mip 偏差是渲染管线级别的设置,用于在特定情况下调整纹理的细节级别。例如,在动态分辨率渲染中,当实际渲染分辨率低于显示分辨率时,适当的 mip 偏差可以减少纹理过锐化的视觉问题。
启用 Use Global Mip Bias 时,节点会尊重项目设置中的全局 mip 偏差配置。这对于保持视觉一致性很重要,特别是在支持多种硬件配置的项目中。禁用此选项时,节点将完全依赖局部设置,这为特殊效果的实现提供了更多控制权。
Mip Sampling Mode 设置提供了不同精度的 mip 控制策略:
Standard 模式是最常用的设置,适用于绝大多数情况。在这种模式下,渲染管线基于屏幕空间中的纹理像素密度自动计算合适的 mip 级别。这种自动计算考虑了纹理的缩放比例、摄像机的距离以及透视变换等因素,为不同距离和角度的表面选择适当细节级别的 mip。
LOD 模式提供了精确的 mip 级别控制,用户可以通过 LOD 输入端口指定具体的 mip 级别。这种模式适用于需要特殊效果的情况,比如:
- 在顶点着色器中采样纹理
- 实现自定义的 mip 过渡效果
- 创建风格化的纹理细节变化
Gradient 模式允许用户提供自定义的导数计算,而不是使用从 UV 坐标自动计算的导数。这种高级模式在特定情况下可以解决视觉问题,比如在球面映射或其他复杂 UV 映射中出现的接缝问题。通过提供连续的导数计算,可以确保 mip 级别在 UV 不连续处的平滑过渡。
Bias 模式在自动计算的 mip 级别基础上应用一个偏差值,微调纹理的细节表现。正偏差值会使纹理看起来更模糊(使用较低分辨率的 mip),负偏差值会使纹理保持更锐利(使用较高分辨率的 mip)。这种模式常用于:
- 艺术指导的细节调整
- 特定材质类型的特性模拟
- 性能与质量的平衡调节
输出
Sample Texture 2D 节点的输出端口设计考虑了不同使用场景的需求,既提供了完整的颜色向量输出,也提供了各个颜色通道的单独输出。
| 名称 | 类型 | 描述 |
|---|---|---|
| RGBA | Vector 4 | 纹理样本的完整 RGBA 颜色值,以 Vector 4 形式返回 |
| R | Float | 纹理样本的红色通道分量 |
| G | Float | 纹理样本的绿色通道分量 |
| B | Float | 纹理样本的蓝色通道分量 |
| A | Float | 纹理样本的 Alpha 透明度通道分量 |
RGBA 输出是节点的主要输出,提供了采样位置的完整颜色信息。在大多数情况下,这个输出会直接连接到 Master Stack 中的 Base Color 块,或者作为其他颜色计算的基础输入。Vector 4 的格式使得颜色值可以方便地参与各种数学运算和效果组合。
各个通道的单独输出为特定的效果实现提供了便利。例如:
- R 输出常用于单通道掩码纹理的采样,如粗糙度贴图、金属度贴图等
- G 输出可以用于绿色通道存储的特殊信息,如高度图的部分数据
- B 输出在法线贴图中通常包含最重要的法线信息
- A 输出广泛用于透明度混合、裁剪遮罩和特殊效果的强度控制
在法线贴图模式下,虽然输出端口的名称保持不变,但数据的语义发生了变化。此时 RGBA 输出中的 RGB 分量表示的是法线向量的 XYZ 方向,而不是颜色值。法线向量的各个分量通常被编码在[0,1]范围内,实际的法线方向需要通过映射到[-1,1]范围来还原。
理解输出的数据语义对于正确使用 Sample Texture 2D 节点至关重要。特别是在处理非颜色数据时(如法线、高度、物理属性等),用户需要确保后续的处理节点能够正确解释这些数据。
示例图表用法
Sample Texture 2D 节点的实际应用展示了其在解决复杂渲染问题时的强大能力。以下示例详细说明了如何使用不同的 mip 采样模式解决球面映射中的接缝问题。
在球面环境映射或天空盒渲染中,经常使用经纬度格式的 2D 纹理(latlong 纹理)。这种纹理格式将球面坐标展开为矩形图像,类似于世界地图的投影方式。然而,当这种映射应用于球体模型时,在纹理的左右边界处会出现接缝问题。
上图中的示例展示了标准采样模式下出现的接缝问题。UV Lat Long 子图节点负责将球面坐标转换为经纬度 UV 坐标,这些坐标正确地映射了球体表面与 latlong_test 纹理的关系。然而,在接缝处(纹理左右边界交汇处),UV 坐标从 0 跳变到 1(或反之),这种不连续性导致 mip 级别计算错误。
问题的根源在于 mipmap 系统的导数计算。在标准采样模式下,渲染管线基于 UV 坐标的屏幕空间导数自动选择 mip 级别。在 UV 不连续的区域,导数计算会出现极大值,导致选择了不合适的低分辨率 mip,从而产生可见的接缝。
解决方案是使用 Gradient mip 采样模式,并提供手动计算的连续导数:
在这个改进的配置中,我们创建了两套 UV 系统:
- 采样 UV:使用经纬度坐标正确采样 latlong 纹理
- 导数 UV:使用球体的标准 UV 坐标计算连续的导数
通过将标准 UV 坐标连接到 Sample Texture 2D 节点的 DDX 和 DDY 输入端口,我们为 mip 计算提供了连续的导数信息。这样,即使在经纬度 UV 不连续的接缝区域,mip 级别也能保持连续和一致,从而消除可见的接缝。
这种技术的核心思想是分离采样坐标和导数计算坐标。采样坐标确保纹理内容正确映射到模型表面,而导数坐标确保 mip 级别计算的连续性。这种方法不仅适用于球面映射,还可以推广到其他复杂 UV 映射的场景中。
实现细节包括:
- 创建 UV Lat Long 子图计算正确的采样坐标
- 使用模型原始 UV 坐标计算连续导数
- 配置 Sample Texture 2D 节点使用 Gradient mip 采样模式
- 正确连接 DDX 和 DDY 输入端口
这种解决方案展示了 Sample Texture 2D 节点高级功能的实际价值,通过精细控制采样过程的各个方面,可以解决复杂的视觉问题。
生成代码示例
理解 Sample Texture 2D 节点生成的底层着色器代码有助于深入掌握其工作原理,并为高级定制提供基础。
默认模式代码生成
text
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;
在默认模式下,节点生成相对简单的代码结构:
SAMPLE_TEXTURE2D是 Unity 的着色器宏,它根据目标平台和渲染管线转换为适当的采样指令- 宏参数包括纹理资源、采样器状态和 UV 坐标
- 采样结果存储在
_SampleTexture2D_RGBA变量中 - 各个通道分量通过 swizzle 操作提取到单独变量中
这种代码结构确保了跨平台兼容性,因为 SAMPLE_TEXTURE2D 宏会在不同图形 API(如 DirectX、OpenGL、Vulkan 等)下转换为对应的原生采样指令。
法线模式代码生成
text
float4 _SampleTexture2D_RGBA = SAMPLE_TEXTURE2D(Texture, Sampler, UV);
_SampleTexture2D_RGBA.rgb = UnpackNormalmapRGorAG(_SampleTexture2D_RGBA);
float _SampleTexture2D_R = _SampleTexture2D_RGBA.r;
float _SampleTexture2D_G = _SampleTexture2D_RGBA.g;
float _SampleTexture2D_B = _SampleTexture2D_RGBA.b;
float _SampleTexture2D_A = _SampleTexture2D_RGBA.a;
法线模式下的代码生成增加了关键的解包步骤:
UnpackNormalmapRGorAG函数负责将压缩的法线贴图数据还原为完整的法线向量- 这个函数会检测纹理的压缩格式并应用正确的解包算法
【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)