From 26c1cf58f483e64d80703fe37c4bd3923d1ff5b7 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 25 Feb 2019 19:57:11 +0100 Subject: Merge streaming into collide shader i.e. implement the A-B pattern. Dispatching only one compute shader per interaction-less simulation step already yields very noticeable performance gains. All cell types are now fully handled by the collide shader which further simplifies the code. --- src/shader/code/collide.glsl | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'src/shader/code/collide.glsl') diff --git a/src/shader/code/collide.glsl b/src/shader/code/collide.glsl index 673a285..4efd7fb 100644 --- a/src/shader/code/collide.glsl +++ b/src/shader/code/collide.glsl @@ -61,7 +61,7 @@ float get(uint x, uint y, int i, int j) { } void set(uint x, uint y, int i, int j, float v) { - collideCells[indexOfLatticeCell(x,y) + indexOfDirection(i,j)] = v; + streamCells[indexOfLatticeCell(x,y) + indexOfDirection(i,j)] = v; } void setFluid(uint x, uint y, vec2 v) { @@ -105,6 +105,18 @@ bool isBulkFluidCell(int material) { return material == 1 || material == 4 || material == 5 || material == 6; } +bool isBounceBackCell(int material) { + return material == 2 || material == 3; +} + +bool isInflowCell(int material) { + return material == 5; +} + +bool isOutflowCell(int material) { + return material == 6; +} + float getExternalMassInflux(int material) { if ( material == 4 ) { return 1.5; @@ -113,7 +125,7 @@ float getExternalMassInflux(int material) { } }; -/// Actual collide kernel +/// Actual collide&stream kernel void main() { const uint x = gl_GlobalInvocationID.x; @@ -125,14 +137,14 @@ void main() { const int material = getMaterial(x,y); - if ( isBulkFluidCell(material) ) { - float d = max(density(x,y), getExternalMassInflux(material)); - vec2 v = velocity(x,y,d); + float d = max(density(x,y), getExternalMassInflux(material)); + vec2 v = velocity(x,y,d); - if ( material == 5 ) { + if ( isBulkFluidCell(material) ) { + if ( isInflowCell(material) ) { v = vec2(0.1,0.0); } - if ( material == 6 ) { + if ( isOutflowCell(material) ) { d = 1.0; } @@ -140,7 +152,15 @@ void main() { for ( int i = -1; i <= 1; ++i ) { for ( int j = -1; j <= 1; ++j ) { - set(x,y,i,j, get(x,y,i,j) + omega * (equilibrium(d,v,i,j) - get(x,y,i,j))); + set(x+i,y+j,i,j, get(x,y,i,j) + omega * (equilibrium(d,v,i,j) - get(x,y,i,j))); + } + } + } + + if ( isBounceBackCell(material) ) { + for ( int i = -1; i <= 1; ++i ) { + for ( int j = -1; j <= 1; ++j ) { + set(x+(-1)*i,y+(-1)*j,(-1)*i,(-1)*j, get(x,y,i,j) + omega * (equilibrium(d,v,i,j) - get(x,y,i,j))); } } } -- cgit v1.2.3