【问题标题】:Atlas UV map vs. Local UV mapAtlas UV 贴图与局部 UV 贴图
【发布时间】:2017-03-29 17:37:22
【问题描述】:
我想使用 UV 坐标在我的精灵上发光,但问题是,如果精灵源自 Unity 的精灵打包程序创建的图集,那么 UV 不是从 0 标准化到 1,而是从和到两个任意价值观。如何规范化位于图集中的单个精灵的 UV 数据?我是否需要将其他信息解析到着色器中,或者我是否应该已经拥有执行此过程所需的信息?下图描述了这种情况:
左边的手不是来自地图集的精灵。右边的手是来自地图集的精灵。我希望右手看起来和左手一样。
我对着色器还不是很熟悉,所以我依赖于使用 shaderforge。我正在使用以下 shaderforge 布局:
【问题讨论】:
标签:
unity3d
shader
uv-mapping
【解决方案1】:
您可能已经知道这一点,但根本问题是“UV Coords”节点的输出。着色器中的其他节点期望归一化的 UV 范围为 0 到 1,但这不是您在使用纹理图集时得到的。
我可以想出两种方法来解决这个问题。它们都是可行的,因此我建议您尝试任何一种更适合您的工作流程的方法。
添加第二个 UV 通道
将 UV0 视为唯一的 UV 通道很容易,但对于某些技术,为每个顶点添加多个 UV 坐标会很有帮助。
例如,光照贴图是一种流行的功能,其中每个模型都有自己的单独纹理(漫反射/法线/等),但每个场景都有一个预烘焙的光照贴图纹理,该纹理在多个模型之间共享——有点像照明信息图集。这些 UV 将不匹配,因此光照贴图 UV 存储在第二个通道 (UV1) 上。
以类似的方式,您可以将 UV0 用于图集 UV,将 UV1 用于局部 UV。这为您提供了在 [0,1] 范围内的干净输入,您可以将其用于该乘法效果。
添加材质参数
您可以scale and offset UV 以便它们被标准化。
- 在渲染之前,找到网格的 UV 坐标的
min 和 max 值
- 将这些值作为材料参数传入
- 添加着色器节点以缩放和偏移输入 UV,从而使范围标准化
例如,您可以将 min 添加到每个 UV(偏移),然后除以 max - min(比例)。