Unity Shader Graph:结合纹理旋转和偏移

Unity Shader Graph: Combining texture rotation and offset

我正在模拟水,我正在尝试可视化速度场。在这个演示中,我不断地在图像的中心添加水,那里是蓝色 'raindrop' 的东西。

我有一个纹理,其中 rg 是速度的 X 和 Y 方向,ba 是水通过它的总运动(即:每一步 ba = ba + rg * delta_time) .

我正在使用 Unity Shader Graph。

我想沿速度方向旋转 'ripple' 纹理,然后也沿该方向平移。为了防止着色器在速度变化时跳来跳去,我想到了使用 ba 通道(以前未使用过)来保持如上所述的总速度。

但是,旋转(仅基于速度)和平移(基于'total velocity')都可以很好地自己。但是当我将它们加在一起时,看起来翻译也被旋转了。我不确定为什么会这样。

这是我的做法:

第一部分: 沿速度方向旋转我的水纹理,看起来不错:

着色器本身看起来像这样:

所以基本上我将 uv 离散化(右侧的自定义函数),获取速度的角度(使用 arctan2),然后使用 Rotate 块旋转每个离散块。这按预期工作。

第二部分: 根据总速度(在 ba 通道中)平移纹理,也按预期工作:

着色器本身看起来像这样:

我再次使用离散化 uv,现在我根据 ba 通道平移每个块,其中包含总速度(每个时间步长 ba = ba + rg * delta_time)。正如您所看到的,这显示纹理从中心流走(不断添加水)。这是我希望发生的事情。

现在,当我组合它们时,它出错了:

我用红色圈出的那个最能说明问题(尽管所有块似乎都在某种程度上有问题,这取决于它们旋转了多少)。箭头指向右下角,这似乎是正确的,但现在流向了顶部。

着色器:

所以在这里我将旋转的离散块添加到翻译中。但看起来翻译部分现在也旋转了,即使我将它们加在一起 ​​ 旋转块之后。因此,虽然翻译没有旋转,但看起来确实如此。

为什么会这样?我该如何解决它。

我希望我解释得充分,因为仅用图片和 gif 来展示它并不容易。

谢谢!

所以我解决了我的问题,而不是将 offsetxy 存储在 b & a 通道,只存储在 b 通道中移动的总距离(因此 b += length(rg))。 然后我使用 float2(0, b)` 作为偏移量。 然后由于某种原因它也被旋转并且在视觉上按照我想要的方式工作。

然而,我仍然不明白为什么,有时我觉得我明白了,然后我想多了,我就不再想了。 因此,如果有人知道为什么会发生这种情况并且可以解释,我很乐意接受这个答案。 不过,目前已经解决了。