sparse fluid simulation in directx - gtc on...
TRANSCRIPT
![Page 1: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/1.jpg)
Alex Dunn – Graphics Dev. Tech.
SPARSE FLUID SIMULATION IN DIRECTX
![Page 2: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/2.jpg)
2
AGENDA
We want more fluid in games!
Eulerian Fluid Simulation.
Sparse Eulerian Fluid.
Feature Level 11.3 Enhancements.
![Page 3: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/3.jpg)
3
WHY DO WE NEED FLUID IN GAMES?
Replace particle kinematics!
more realistic == better user immersion
More than just eye candy?
game mechanics?
![Page 4: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/4.jpg)
4
EULERIAN SIMULATION #1
Inject
Advect
Pressure
Vorticity
Evolve
2x Velocity
2x Pressure
1x Vorticity
My (simple) DX11.0 eulerian fluid simulation:
![Page 5: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/5.jpg)
5
EULERIAN SIMULATION #2
Add fluid to simulation
Move data at, XYZ (XYZ+Velocity)
Calculate localized pressure
Calculates localized rotational flow
Tick Simulation
Inject
Advect
Pressure
Vorticity
Evolve
![Page 6: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/6.jpg)
6
**(some imagination required)**
![Page 7: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/7.jpg)
7
![Page 8: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/8.jpg)
8
TOO MANY VOLUMES SPOIL THE…
Fluid isn’t box shaped.
clipping
wastage
Simulated separately.
authoring
GPU state
volume-to-volume interaction
Tricky to render.
![Page 9: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/9.jpg)
9
![Page 10: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/10.jpg)
10
PROBLEM!
N-order problem
64^3 = ~0.25m cells
128^3 = ~2m cells
256^3 = ~16m cells
…
Applies to:
computational complexity
memory requirements
0
1024
2048
3072
4096
5120
6144
7168
8192
0 256 512 768 1024
Mem
ory
(M
b)
Dimensions (X = Y = Z)
Texture3D - 4x16F
And that’s just 1 texture…
![Page 11: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/11.jpg)
11
BRICKS
Split simulation space into groups of cells (each known as a brick).
Simulate each brick independently.
![Page 12: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/12.jpg)
12
BRICK MAP
Need to track which bricks contain fluid
Texture3D<uint>
1 voxel per brick
0 Ignore
1 Simulate
Could also use packed binary grids [Gruen15], but this requires atomics
![Page 13: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/13.jpg)
13
TRACKING BRICKS #1
Initialise using fluid emitters.
(easy with primitives)
![Page 14: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/14.jpg)
14
TRACKING BRICKS #2
Simulating air is important for accuracy.
Simulate? = |Velocity| > 0
![Page 15: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/15.jpg)
15
TRACKING BRICKS #3
Expansion (ignore simulate)
if { V|x|y|z| > |Dbrick| }
expand simulation in that axis
Reduction (simulate ignore)
inverse of Expansion
handled automatically by clear
![Page 16: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/16.jpg)
16
SPARSE SIMULATION
Inject
Advect
Pressure
Vorticity
Evolve*
Clear BrickMap
Fill List
Reset all to 0 (ignore) in brick map.
Texture3D<uint> g_BrickMapRO; AppendStructredBuffer<uint3> g_ListRW; if(g_BrickMapRO[idx] != 0) { g_ListRW.Append(idx); }
Read value from brick map. Append brick coordinate to list if occupied.
*Includes expansion
![Page 17: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/17.jpg)
17
PROBLEM!
N-order problem
64^3 = ~0.25m cells
128^3 = ~2m cells
256^3 = ~16m cells
…
Applies to:
computational complexity
memory requirements
0
1024
2048
3072
4096
5120
6144
7168
8192
0 256 512 768 1024
Mem
ory
(M
b)
Dimensions (X = Y = Z)
Texture3D - 4x16F
And that’s just 1 texture…
![Page 18: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/18.jpg)
18
UNCOMPRESSED STORAGE
Allocate everything; forget about
unoccupied cells
Pros: • simulation is coherent in memory.
• works in DX11.0.
Cons: • no reduction in memory usage.
Simulate
Ignore
![Page 19: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/19.jpg)
19
COMPRESSED STORAGE
Similar to, List<Brick>
Pros: • good memory consumption.
• works in DX11.0.
Cons: • allocation strategies.
• indirect lookup.
• “software translation”
• filtering particularly costly
Indirection Table
Physical Memory
![Page 20: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/20.jpg)
20
1 Brick = (4)3 = 64
PADDING TO REDUCE EDGE CASES
![Page 21: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/21.jpg)
21
1 Brick = (1+4+1)3 = 216 • New problem; • “6n2 +12n + 8” problem.
Can we do better?
PADDING TO REDUCE EDGE CASES
![Page 22: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/22.jpg)
22
ENTER; FEATURE LEVEL 11.3 Volume Tiled Resources (VTR)!
Extends 2D functionality in FL11.2
Must query HW support: (DX11.3 != FL11.3):
ID3D11Device3* pDevice3 = nullptr; pDevice->QueryInterface(&pDevice3); D3D11_FEATURE_DATA_D3D11_OPTIONS2 support; pDevice3->CheckFeatureSupport(D3D11_FEATURE_D3D11_OPTIONS2, &support, sizeof(support)); m_UseTiledResources = support.TiledResourcesTier == D3D11_TILED_RESOURCES_TIER_3;
![Page 23: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/23.jpg)
23
TILED RESOURCES #1
Pros: • only mapped memory is
allocated in VRAM
• “hardware translation”
• logically a volume texture
• all samplers supported
• 1 Tile = 64KB (= 1 Brick)
• fast loads
![Page 24: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/24.jpg)
24
TILED RESOURCES #2
1 Tile = 64KB (= 1 Brick)
BPP Tile Dimensions
8 64x32x32
16 32x32x32
32 32x32x16
64 32x16x16
128 16x16x16
![Page 25: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/25.jpg)
25
TILED RESOURCES #3
HRESULT ID3D11DeviceContext2::UpdateTileMappings( ID3D11Resource *pTiledResource, UINT NumTiledResourceRegions, const D3D11_TILED_RESOURCE_COORDINATE *pTiledResourceRegionStartCoordinates, const D3D11_TILE_REGION_SIZE *pTiledResourceRegionSizes, ID3D11Buffer *pTilePool, UINT NumRanges, const UINT *pRangeFlags, const UINT *pTilePoolStartOffsets, const UINT *pRangeTileCounts, UINT Flags );
Letting the driver know which bricks/tiles should be resident:
![Page 26: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/26.jpg)
26
UPDATE TILE MAPPINGS – TIP
Don’t update all tiles every frame.
const UINT *pRangeFlags
Track tile deltas and use the range flags;
Ignore (unmapped) D3D11_TILE_RANGE_NULL
Simulate (mapped) D3D11_TILE_RANGE_REUSE_SINGLE_TILE
Unchanged D3D11_TILE_RANGE_SKIP
![Page 27: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/27.jpg)
27
CPU READ BACKS
Taboo in real time graphics
CPU read backs are fine, if done correctly! (and bad if not)
2 frame latency (more for SLI)
Profile map/unmap calls if unsure
Frame N+2
Frame N+1 Frame N+2 Frame N+3 Frame N
Frame N+1 Frame N
N;
Data Ready
N+1;
Data Ready
N+2;
Data Ready
N; Tiles Mapped
CPU:
GPU:
![Page 28: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/28.jpg)
28
LATENCY RESISTANT SIMULATION #1
Naïve Approach:
clamp velocity to Vmax
CPU Read-back:
occupied bricks.
2 frames of latency!
extrapolate “probable” tiles.
![Page 29: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/29.jpg)
29
LATENCY RESISTANT SIMULATION #2
Better Approach:
CPU Read-back:
occupied bricks.
max{|V|} within brick.
2 frames of latency!
extrapolate “probable” tiles.
![Page 30: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/30.jpg)
30
LATENCY RESISTANT SIMULATION #3
Sparse
Eulerian
Simulation
Read back
Brick List
CPU Read
back Ready?
Yes
Prediction
Engine
Emitter
Bricks
No
UpdateTile
Mappings
CPU GPU
![Page 31: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/31.jpg)
31
DEMO
![Page 32: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/32.jpg)
32
PERFORMANCE #1
NOTE: Numbers captured on a GeForce GTX980
2.3
19.9
64.7
0.4 1.8 2.7 2.9 6.0
128 256 384 512 1024
Sim
. Tim
e (
ms)
Grid Resolution
Full Grid
Sparse Grid
![Page 33: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/33.jpg)
33
PERFORMANCE #2
NOTE: Numbers captured on a GeForce GTX980
80
640
2,160 5,120
40,960
11
46 57 83 138
128 256 384 512 1024
Mem
ory
(M
B)
Grid Resolution
Full Grid
Sparse Grid
![Page 34: SPARSE FLUID SIMULATION IN DIRECTX - GTC On …on-demand.gputechconf.com/siggraph/2015/presentation/SIG1506-Alex... · 4 EULERIAN SIMULATION #1 Inject Advect Pressure Vorticity Evolve](https://reader031.vdocuments.mx/reader031/viewer/2022022603/5b5ce7117f8b9a9c398d1039/html5/thumbnails/34.jpg)
Thank you!
Alex Dunn - [email protected]
Twitter: @AlexWDunn
Other “latency resistant”
techniques using tiled resources??