【节点】[SampleTexture2D节点]原理解析与实际应用

【Unity Shader Graph 使用与特效实现】专栏-直达

描述

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 系统:

  1. 采样 UV:使用经纬度坐标正确采样 latlong 纹理
  2. 导数 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 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
UWA8 小时前
如何降低Animator的调用次数
性能优化·memory·游戏开发·animation
龙智DevSecOps解决方案9 小时前
邀请函 | 诚邀您参加Perforce on Tour 2026 游戏研发效能进阶沙龙(广州站),探索AI时代如何更高效、安全地开发游戏
游戏·ai·游戏开发·perforce·龙智
C蔡博士1 天前
Unity游戏物体渲染顺序
unity·游戏引擎·游戏开发
SmalBox1 天前
【节点】[SamplerState节点]原理解析与实际应用
unity3d·游戏开发·图形学
Invincible_2 天前
3D Tiles 2.0 技术审查整理稿
程序员·unity3d
UWA2 天前
顺势而为,AI 技术融入性能优化
人工智能·ai·性能优化·游戏开发
SmalBox2 天前
【节点】[SampleReflectedCubemap节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox3 天前
【节点】[SampleCubemap节点]原理解析与实际应用
unity3d·游戏开发·图形学
有中二病没中二命3 天前
Unity —— Animator 状态机事件通知(Animator 1-2)
unity3d