Atlas UV 贴图与本地 UV 贴图

Atlas UV map vs. Local UV map

我想使用 UV 坐标在我的 sprite 上发光,但问题是,如果 sprite 源自 Unity 的 sprite packer 创建的图集,那么 UV 不会从 0 归一化为 1,而是从和到两个任意值。如何为位于图集中的单个精灵标准化 UV 数据?我是否需要将其他信息解析到着色器中,或者我是否应该已经拥有执行此过程所需的信息?下图描述了这种情况:

左边的手不是来自地图集的精灵。右边的手是来自地图集的精灵。我想让右手和左手看起来一样。

我还不太熟悉着色器,所以我依赖于使用 shaderforge。我正在使用以下 shaderforge 布局:

您可能已经知道这一点,但根本问题是您的 "UV Coords" 节点的输出。着色器中的其他节点需要范围从 0 到 1 的标准化 UV,但这不是您在使用纹理图集时得到的结果。

我可以想到两种方法来解决这个问题。它们都是可行的,所以我建议您尝试使用更适合您的工作流程的那个。

添加第二个 UV 通道

将 UV0 视为唯一的 UV 通道很容易,但对于某些技术,向每个顶点添加多个 UV 坐标可能会有所帮助。

例如,光照贴图是一种流行的功能,其中每个模型都有自己的单独纹理 (diffuse/normal/etc),但每个场景都有一个预烘焙的光照贴图纹理,可在多个模型之间共享——有点像就像照明信息的地图集。这些的 UV 将不匹配,因此光照贴图 UV 存储在第二个通道 (UV1) 上。

以类似的方式,您可以将 UV0 用于图谱 UV,将 UV1 用于局部 UV。这为您提供了 [0,1] 范围内的干净输入,您可以将其用于乘法效果。

添加 material 参数

您可以 scale and offset UV,以便它们被归一化。

  1. 渲染前,找到网格 UV 坐标的 minmax
  2. 将这些值作为 material 参数传递
  3. 添加着色器节点以缩放和偏移输入 UV,以便范围标准化

例如,您可以将 min 添加到每个 UV(偏移),然后除以 max - min(比例)。