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 来展示它并不容易。
谢谢!
所以我解决了我的问题,而不是将 offset 的 x
和 y
存储在 b
& a
通道,只存储在 b 通道中移动的总距离(因此 b += length(rg)
)。
然后我使用 float2(0, b)` 作为偏移量。
然后由于某种原因它也被旋转并且在视觉上按照我想要的方式工作。
然而,我仍然不明白为什么,有时我觉得我明白了,然后我想多了,我就不再想了。
因此,如果有人知道为什么会发生这种情况并且可以解释,我很乐意接受这个答案。
不过,目前已经解决了。
我正在模拟水,我正在尝试可视化速度场。在这个演示中,我不断地在图像的中心添加水,那里是蓝色 '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 来展示它并不容易。
谢谢!
所以我解决了我的问题,而不是将 offset 的 x
和 y
存储在 b
& a
通道,只存储在 b 通道中移动的总距离(因此 b += length(rg)
)。
然后我使用 float2(0, b)` 作为偏移量。
然后由于某种原因它也被旋转并且在视觉上按照我想要的方式工作。
然而,我仍然不明白为什么,有时我觉得我明白了,然后我想多了,我就不再想了。 因此,如果有人知道为什么会发生这种情况并且可以解释,我很乐意接受这个答案。 不过,目前已经解决了。