我正在尝试在Unity中使用计算着色器复制我在Shadertoy上工作的2D流体,并希望很快将其移植到3D。但是当我按照相同的方式复制算法时,会出现一些非常奇怪的行为(可以在我录制的这个视频中看到)。我已经尝试了调试所有我能想到的东西,但是我无法弄清楚它们为什么不同。在此捕获中我正在可视化向量矩阵(与查看我的shadertoy时按空格键相同)。
我创建了一个Pastebin网页,其中包含我用于执行驱动速度矩阵的Navier-Stokes方程式的代码核心部分。模拟的主要内容如下:
这应该是相当简单的,我尽力注释了Shadertoy,以便易于理解(它们是相同的代码,适用于不同的环境)。 这里是驱动模拟的C#代码。 我知道请求别人深入研究我的代码很不方便,但我完全不确定自己做错了什么,这让我疯了。我在Shadertoy上有完全相同的算法,但在Unity计算着色器中表现得非常奇怪,我无法弄清楚原因。每次“步进”时,我都会确保切换读/写纹理,以便清晰地向前移动模拟而不产生干扰。
对于修复问题的任何想法/提示将不胜感激。
我创建了一个Pastebin网页,其中包含我用于执行驱动速度矩阵的Navier-Stokes方程式的代码核心部分。模拟的主要内容如下:
float4 S(RWTexture2D<float4> target, uint2 id)
{
return target[(id.xy + resolution)%resolution];
}
void Fluid(RWTexture2D<float4> target, uint2 id, float2 offset, float4 values, inout float2 velocity, inout float pressure, inout float divergence, inout float neighbors)
{
float2 v = S(target, id.xy + offset);
float4 s = S(target, id.xy + offset.xy - v);
float2 o= normalize(offset);
velocity += o * (s.w - values.w);
pressure += s.w;
divergence += dot(o, s.xy);
++neighbors;
}
void StepVelocity(uint3 id, RWTexture2D<float4> write, RWTexture2D<float4> read, bool addJet)
{
//sample our current values, then sample the values from the cell our velocity is coming from
float4 values = S(read, id.xy);
values = S(read, id.xy - values.xy);
float2 velocity = float2(0,0);
float pressure = 0;
float neighbors = 0;
float divergence = 0;
//sample neighboring cells
Fluid(read, id.xy, float2(0, 1), values, velocity, pressure, divergence, neighbors);
Fluid(read, id.xy, float2(0, -1), values, velocity, pressure, divergence, neighbors);
Fluid(read, id.xy, float2(1, 0), values, velocity, pressure, divergence, neighbors);
Fluid(read, id.xy, float2(-1, 0), values, velocity, pressure, divergence, neighbors);
velocity = velocity / neighbors;
divergence = divergence / neighbors;
pressure = pressure/neighbors;
values.w = pressure-divergence;
values.xy -= velocity;
if (addJet && distance(id.xy, float2(resolution / 2.0, resolution / 2.0)) < 10)
values = float4(0, .25, 0, values.w);
write[id.xy] = values;
}
这应该是相当简单的,我尽力注释了Shadertoy,以便易于理解(它们是相同的代码,适用于不同的环境)。 这里是驱动模拟的C#代码。 我知道请求别人深入研究我的代码很不方便,但我完全不确定自己做错了什么,这让我疯了。我在Shadertoy上有完全相同的算法,但在Unity计算着色器中表现得非常奇怪,我无法弄清楚原因。每次“步进”时,我都会确保切换读/写纹理,以便清晰地向前移动模拟而不产生干扰。
对于修复问题的任何想法/提示将不胜感激。