sparse fluid simulation in directx - gtc on...

34
Alex Dunn – Graphics Dev. Tech. SPARSE FLUID SIMULATION IN DIRECTX

Upload: duongtuyen

Post on 29-Jul-2018

218 views

Category:

Documents


0 download

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Thank you!

Alex Dunn - [email protected]

Twitter: @AlexWDunn

Other “latency resistant”

techniques using tiled resources??