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

时间:2019-09-01 10:30:29

标签: unity3d shader pixel-shader

我正在模拟水,并且试图可视化速度场。在此演示中,我不断在图像的中心添加水,蓝色的“雨滴”就是这里。

我有一个纹理,其中rg是速度的X和Y方向,而ba是水在其中通过的总运动量(即,每一步ba = ba + rg * delta_time)。 / p>

我正在使用Unity Shader Graph。

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

但是,旋转(仅基于速度)和平移(基于“总速度”)两者都可以很好地运行 。但是当我将它们加在一起时,看起来平移也在旋转。我不确定为什么会这样。

这就是我要做的:

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

enter image description here

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

enter image description here

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

第二部分:基于总速度(在ba通道中)转换纹理,也可以按预期工作:

enter image description here

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

enter image description here

同样,我使用离散的uv,现在我基于ba通道转换每个块,其中包含速度的总和(每个时间步长ba = ba + rg * delta_time)。如您所见,这显示出纹理从中心流出(不断添加水)。这就是我所期望的。

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

enter image description here

enter image description here

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

着色器:

enter image description here

所以在这里,我将旋转的离散块添加到平移中。但是,即使我在旋转块的之后将它们加在一起,看起来平移部分现在也已经旋转了。因此,虽然旋转不旋转,但看起来却是。

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

我希望我能充分解释它,因为要在图片和gif中显示并不容易。

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,我解决了问题,而不是将{strong> offset 的xy存储在ba渠道中,只需存储在b通道中移动的总距离即可(因此b += length(rg))。 然后我使用float2(0,b)`作为偏移量。 然后由于某种原因,它也会旋转,并且在视觉上可以按我的意愿工作。

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