【问题标题】:Why is Shader Graph Transform node affected by UV mapping?为什么 Shader Graph Transform 节点会受到 UV 映射的影响?
【发布时间】:2022-09-02 00:24:13
【问题描述】:
我遇到了法线贴图在我的自定义着色器中行为不正确的问题,最终设法找到了原因。事实证明,这是我的对象的 UV 映射方式。在 UV0 中,我存储了到调色板纹理的映射——所有 UV 都被打乱在一起,因为唯一重要的是它们位于具有正确颜色的像素上。在 UV1 中,我存储了传统的 UV uwrap,用于应用法线贴图。为了获得法线贴图,我使用了这样的设置:
我正在做自己的光照计算,所以我需要在使用之前将法线从切线空间转换到世界空间。
这种方法导致了两个问题 - 奇怪的伪影和法线“卡”在对象上:
右边的球体是颠倒的,如果你看一下法线,它们也是颠倒的。工件在两个球体上,但从这个角度来看,它们在右侧可见。
原因似乎是我使用 UV0 将对象映射到调色板的方式。它以某种方式影响了由 Transform 节点完成的切线到世界空间变换(我知道它是这个节点,因为删除它会使工件消失)。此外,交换 UV 通道以使传统展开在 UV0 中,而调色板映射在 UV1 中修复了该问题:
没有伪影,法线也没有粘在物体上。
那么为什么变换节点会受到UV映射的影响呢?我认为它会根据对象的几何形状进行转换。如果它使用 UV 贴图,为什么没有下拉菜单来选择要使用的 UV?
【问题讨论】:
标签:
unity3d
shader
fragment-shader
vertex-shader
shader-graph
【解决方案1】:
切线空间(又名纹理空间) 部分由几何(法线)定义,但也由 uv 坐标(切线)定义。
正如法线是从顶点位置导出的一样,切线是从 UV 中推断出来的。它本质上是一个对象空间矢量 (xyz),它指向 U 轴(在您的 UV 空间中水平)并且垂直于法线。
法线贴图是纹理空间中的一个向量,位图的通道可以看作是每个向量相对于顶点定义的切线空间的偏移量。
half3 TangentToObjectSpace(half3 input, half3 nml, half3 tgt, half3 btg) {
return tgt * input.x + btg * input.y + nml * input.z;
}
如您所见,input.x(法线贴图红色通道,它定义了向量的水平部分)正在调制切线。我们需要另一个用于绿色通道的向量,我们可以使用cross product 生成它:提供两个现有向量,您可以获得一个垂直于两者的新向量。问题:对于翻转的 UV 壳,此生成的矢量指向错误的方向。在 Unity 中,切线实际上是 vector4 和 the last component (w) is the flip of the binormal。
默认情况下,Unity 使用第一个 UV 坐标的切线空间,这就是您通过交换它们来解决问题的原因:)
【解决方案2】:
Transform 节点很可能依赖于 UV 选择,因为它依赖于 Texture Sample 节点的输出。所以这可能是样本节点中输出的细微差别导致变换节点以这种方式运行,而不是变换节点上的一些隐藏 UV 设置。