You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.4 KiB
44 lines
1.4 KiB
|
|
#pragma kernel CSMain
|
|
#define NUM_THREADS 8
|
|
|
|
float _DeltaTime, _Epsilon;
|
|
float4 _Size;
|
|
|
|
RWStructuredBuffer<float3> _Write;
|
|
StructuredBuffer<float3> _Vorticity, _Read;
|
|
|
|
[numthreads(NUM_THREADS,NUM_THREADS,NUM_THREADS)]
|
|
void CSMain (int3 id : SV_DispatchThreadID)
|
|
{
|
|
|
|
int idxL = max(0, id.x-1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
|
|
int idxR = min(_Size.x-1, id.x+1) + id.y*_Size.x + id.z*_Size.x*_Size.y;
|
|
|
|
int idxB = id.x + max(0, id.y-1)*_Size.x + id.z*_Size.x*_Size.y;
|
|
int idxT = id.x + min(_Size.y-1, id.y+1)*_Size.x + id.z*_Size.x*_Size.y;
|
|
|
|
int idxD = id.x + id.y*_Size.x + max(0, id.z-1)*_Size.x*_Size.y;
|
|
int idxU = id.x + id.y*_Size.x + min(_Size.z-1, id.z+1)*_Size.x*_Size.y;
|
|
|
|
float omegaL = length(_Vorticity[ idxL ]);
|
|
float omegaR = length(_Vorticity[ idxR ]);
|
|
|
|
float omegaB = length(_Vorticity[ idxB ]);
|
|
float omegaT = length(_Vorticity[ idxT ]);
|
|
|
|
float omegaD = length(_Vorticity[ idxD ]);
|
|
float omegaU = length(_Vorticity[ idxU ]);
|
|
|
|
int idx = id.x + id.y*_Size.x + id.z*_Size.x*_Size.y;
|
|
|
|
float3 omega = _Vorticity[idx];
|
|
|
|
float3 eta = 0.5 * float3( omegaR - omegaL, omegaT - omegaB, omegaU - omegaD );
|
|
|
|
eta = normalize( eta + float3(0.001,0.001,0.001) );
|
|
|
|
float3 force = _DeltaTime * _Epsilon * float3( eta.y * omega.z - eta.z * omega.y, eta.z * omega.x - eta.x * omega.z, eta.x * omega.y - eta.y * omega.x );
|
|
|
|
_Write[idx] = _Read[idx] + force;
|
|
}
|
|
|