Atlas UV贴图与局部UV贴图

时间:2016-11-15 17:56:59

标签: unity3d shader uv-mapping

我希望使用UV坐标在我的精灵上发光,但问题是,如果精灵来自Unity的精灵打包器创建的地图集,那么UV不会从0到1标准化,但是从两个任意值开始。如何规范驻留在地图册中的单个精灵的UV数据?我是否需要将其他信息解析到着色器中,或者我是否已经拥有执行此过程所需的信息?下图描述了这种情况:

enter image description here

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

我对着色器并不熟悉,所以我依赖于使用shaderforge。我使用以下shaderforge布局: enter image description here

1 个答案:

答案 0 :(得分:1)

您可能已经知道这一点,但根本问题在于您的" UV Coords"节点。着色器中的其他节点期望归一化的UV范围从0到1,但这不是您在使用纹理图集时获得的。

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

添加第二个UV通道

将UV0作为唯一的UV通道很容易处理,但对于某些技术,将多个UV坐标添加到每个顶点会很有帮助。

作为示例,光照贴图是一种流行的功能,其中每个模型都有自己的单独纹理(漫反射/普通/等),但每个场景都有一个预先烘焙的光照贴图纹理,在多个模型之间共享 - 有点像照明信息图集。这些UV的UV不匹配,因此光照贴图UV存储在第二个通道(UV1)上。

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

添加材料参数

你可以scale and offset紫外线,以便它们被标准化。

  1. 在渲染之前,找到网格物体的UV坐标的minmax
  2. 将这些值作为材料参数传递
  3. 添加着色器节点以缩放和偏移输入UV,以使范围标准化
  4. 例如,您可以为每个UV(偏移)添加min,然后除以max - min(比例)。