Presentation is loading. Please wait.

Presentation is loading. Please wait.

Real-time volumetric effects Andrei Tatarinov. NVIDIA Confidential Talk outline Introduction Part I – Generating fire with Perlin noise Part II – Generate.

Similar presentations


Presentation on theme: "Real-time volumetric effects Andrei Tatarinov. NVIDIA Confidential Talk outline Introduction Part I – Generating fire with Perlin noise Part II – Generate."— Presentation transcript:

1 Real-time volumetric effects Andrei Tatarinov

2 NVIDIA Confidential Talk outline Introduction Part I – Generating fire with Perlin noise Part II – Generate smoke using 3D fluid simulation Part III – Rendering volumetrics

3 NVIDIA Confidential Why is this cool? Volumetrics represent such common effects as fog, smoke, fire, explosions Current approaches to rendering volumetrics in games have limitations Video textures Particle systems

4 NVIDIA Confidential What do we have now? Most volumetric effects are represented as sets of video textures Everything looks cool until effect intersects an obstacle

5 NVIDIA Confidential Why now? Sheer number of operations needed can only be supported by modern high end GPUs New features in DirectX10 Render to 3D texture Integer maths Geometry Shader Stream Out

6 NVIDIA Confidential Part I - Fire Outline Perlin noise overview Simplex noise overview Ways to generate procedural textures How to generate a flame using Perlin noise

7 NVIDIA Confidential Perlin Fire Fire in NVIDIA’s DirectX10 SDK Sample

8 NVIDIA Confidential Perlin noise Given an input point P Find its neighboring grid points Q For each grid point Pick pseudo-random gradient vector G Compute linear function G * (P - Q) Interpolate between values in grid points

9 NVIDIA Confidential Random Number generation on GPU Use a set of “power” and “modulation” operations, using some big prime number as a modulation base Use a permutation texture R = PermTex.Sample ( P.yw + PermTex.Sample ( P.xz ) )

10 NVIDIA Confidential Simplex Noise The same as Perlin noise, but using a simplex grid instead of hypercube grid For a space with N dimensions, simplex is the most compact shape that can be repeated to fill the entire space Using simplex grid can significantly reduce a number of interpolations

11 NVIDIA Confidential Procedural Textures Use a weighted sum of several noise frequencies to create a texture ++++= =

12 NVIDIA Confidential Procedural Textures Try noise in different expressions noisesin (x + sum 1/f( |noise| )) sum 1/f(noise)sum 1/f( |noise| )

13 NVIDIA Confidential Volumetric Effects Use noise to animate turbulent flow Flame Clouds

14 NVIDIA Confidential Flame Take a basic fire shape and revolve it around y-axis to create a fire unit Fire shape can be customized to achieve different look and feel Basic shapeFire unit y

15 NVIDIA Confidential Flame Perturb fire unit with 4D noise (4th component stands for time) += Fire unitPerlin noise turbulence field Flame

16 NVIDIA Confidential Flame Use a weighted sum of several noise frequencies. Change weights to achieve different look ++++ = =

17 NVIDIA Confidential Part II - Smoke Outline Why 3D fluid simulation is important Overview of process Fluid simulation basics Dynamic arbitrary boundaries

18 NVIDIA Confidential Smoke Smoke in NVIDIA’s DirectX10 SDK Sample

19 NVIDIA Confidential Overview Composite on top of scene Render Discretize space and simulate Decide where to place the smoke Scene

20 NVIDIA Confidential Fluid Simulation A fluid (with constant density and temperature) is described by a velocity and pressure field Navier-Stokes equations mathematically defines the evolution of these fields over time; impose that the field conserves both mass and momentum To use these equations we discretize the space into a grid Define smoke density, velocity and pressure at the center of each grid cell At each time step, we use the equations to determine the new values of the fields Pressure Density Velocity

21 NVIDIA Confidential Fluid Simulation steps Advect Add Density Add Velocity Project Density Velocity Iterate Pressure Density Velocity Pressure Each time step * We skip the diffusion step Initialize

22 NVIDIA Confidential Advect Velocity Density Time Step t Time Step t + 1 Density

23 NVIDIA Confidential Fluid Simulation on the GPU Velocity, Density, Pressure → Textures Simulate one substep for entire grid → Render a grid sized, screen aligned, quad Calculations for a grid cell → Pixel Shader Output values → using Render to Texture

24 NVIDIA Confidential Advect on the GPU Density Texture at timestep t Velocity Texture at timestep t rasterized rendered Texture fetch Render Target Density for timestep t+1 Quad M O M O M O M O Pixel Shader PS_ADVECT calculate new density for this grid cell using the density and velocity textures from the previous time step Velocity in x Velocity in y

25 NVIDIA Confidential Texture fetch GS is used to rasterize each quad to proper layer in output Render Target Advect on the GPU in 3D Density Texture at timestep t Velocity Texture at timestep t rasterized rendered Pixel Shader Render Target Density for timestep t+1 N Quads M O M O M PS_ADVECT calculate new density for this grid cell using the density and velocity textures from the previous time step N O M N O N

26 NVIDIA Confidential Obstacles Smoke interacting with obstacles and compositing with the scene Smoke only compositing with the scene

27 NVIDIA Confidential Obstacles Implicit shapes Like spheres, cylinders Voxelize objects Static : Voxelize just once, offline Moving:Voxelize objects per frame Obstacle texture Fluid cell inside obstacle Fluid cell outside obstacle

28 NVIDIA Confidential Dealing with Obstacles How should the fluid react to obstacles? The fluid should not enter obstacles cells If the obstacles are moving they should impart the correct velocity on the fluid How the fluid reacts to the obstacles → Boundary Conditions

29 NVIDIA Confidential Boundary Conditions for Density No density should be added to or advected into the interior of obstacles Density Obstacles

30 NVIDIA Confidential Boundary Conditions for Pressure Derivative of the pressure across the boundary should be zero (Neumann boundary conditions - specifying derivative ) cell1 u v cell2 PressureCell1 – PressureCell2 = 0 PressureCell1 = PressureCell2

31 NVIDIA Confidential Boundary Conditions for Velocity The velocity normal to the boundary of the obstacle should be equal for fluid and obstacle (Dirichlet boundary conditions – specifying value) u v

32 NVIDIA Confidential Voxelizing an object Obstacle texture Obstacle Velocity texture

33 NVIDIA Confidential Use low res collision model for voxelization

34 NVIDIA Confidential Voxelizing a simple object ?

35 NVIDIA Confidential Voxelizing a simple object Orthographic camera Near plane Far plane Stencil Buffer Decrement on back faces Increment on front faces

36 NVIDIA Confidential Voxelization ……… 2DArray of N stencil buffers Render model N times, each time with a different near plane

37 NVIDIA Confidential Part III - Rendering Outline Ray marching Occluding the scene Artifacts and ways to avoid them

38 NVIDIA Confidential Rendering Render front faces of box Raycast into the 3D Density texture Composite into scene

39 NVIDIA Confidential Raycasting into 3D texture What we haveWhat we don’t have - Ray from eye to box- Ray in texture space Transform from world to texture space Transform from world to texture space Transform from world to grid space - Ray box intersection - Distance the eye ray traverses through the box - Ray entry point in the texture - Number of voxels the ray traverses = Number of samples to take 3D Density Texture

40 NVIDIA Confidential Raycasting: blending FinalColor.rgba = 0 FinalColor.rgb += sampleColor.rgb * SampleColor.a *(1.0 – FinalColor.a) FinalColor.a += SampleColor.a * (1.0 – FinalColor.a) Density Texture = Trilinear sample from 3D texture Render Fullscreen quad to frame buffer RayDataTexture PositionInTexture = TransformToTexSpace (RayDataTexture.rgb) MarchingVector = TransformToTexSpace (eye - RayDataTexture.rgb) NumberOfSamples = TransformToGridSpace (RayDataTexture.a)

41 NVIDIA Confidential Occluding the scene Smoke correctly compositing with the scene Smoke directly blended on top of the scene

42 NVIDIA Confidential Integrating scene depth

43 NVIDIA Confidential Artifacts During the ray-marching use jittering to avoid banding Without jitteringWith jittering

44 NVIDIA Confidential Jittered sampling During the ray-marching use jittering to avoid banding

45 NVIDIA Confidential Artifacts Increase sampling rate to reduce a noise caused by jittering Increasing sampling rate leads to performance loss Low sampling rateHigh sampling rate

46 NVIDIA Confidential Artifacts Correctly using the depth by weighted sampling Artifacts resulting from an integral number of samples

47 NVIDIA Confidential Correctly integrating scene depth by weighting the last sample FinalColor.rgb += d/sampleWidth * SampleColor.rgb * SampleColor.a * (1.0 – FinalColor.a) FinalColor.a += d/sampleWidth * SampleColor.a * (1.0 – FinalColor.a) sampleWidth d

48 NVIDIA Confidential Combining techniques

49 NVIDIA Confidential Conclusion Interactive volumetric effect simulation at reasonable grid resolutions is feasible for games We presented here a brief overview of the entire process More information NVIDIA DirectX10 SDK code sample Upcoming GPU Gems3 article

50 NVIDIA Confidential Questions?


Download ppt "Real-time volumetric effects Andrei Tatarinov. NVIDIA Confidential Talk outline Introduction Part I – Generating fire with Perlin noise Part II – Generate."

Similar presentations


Ads by Google