Real-time volumetric effects Andrei Tatarinov. NVIDIA Confidential Talk outline Introduction Part I...
-
date post
18-Dec-2015 -
Category
Documents
-
view
215 -
download
0
Transcript of Real-time volumetric effects Andrei Tatarinov. NVIDIA Confidential Talk outline Introduction Part I...
Real-time volumetric effects
Andrei Tatarinov
NVIDIA Confidential
Talk outline
Introduction
Part I – Generating fire with Perlin noise
Part II – Generate smoke using 3D fluid simulation
Part III – Rendering volumetrics
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
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
NVIDIA Confidential
Why now?
Sheer number of operations needed can only be supported by modern high end GPUs
New features in DirectX10Render to 3D texture
Integer maths
Geometry Shader
Stream Out
NVIDIA Confidential
Part I - FireOutline
Perlin noise overview
Simplex noise overview
Ways to generate procedural textures
How to generate a flame using Perlin noise
NVIDIA Confidential
Perlin Fire
Fire in NVIDIA’s DirectX10 SDK Sample
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
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 ) )
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
NVIDIA Confidential
Procedural Textures
Use a weighted sum of several noise frequencies to create a texture
+ + + + =
=
NVIDIA Confidential
Procedural Textures
Try noise in different expressions
noise sin (x + sum 1/f( |noise| ))
sum 1/f(noise) sum 1/f( |noise| )
NVIDIA Confidential
Volumetric Effects
Use noise to animate turbulent flow Flame
Clouds
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 shape Fire unit
y
NVIDIA Confidential
Flame
Perturb fire unit with 4D noise (4th component stands for time)
+ =
Fire unit Perlin noise turbulence field
Flame
NVIDIA Confidential
FlameUse a weighted sum of several noise frequencies. Change weights to achieve different look
+ + + + =
=
NVIDIA Confidential
Part II - SmokeOutline
Why 3D fluid simulation is important
Overview of process
Fluid simulation basics
Dynamic arbitrary boundaries
NVIDIA Confidential
Smoke
Smoke in NVIDIA’s DirectX10 SDK Sample
NVIDIA Confidential
Overview
Composite on top of scene
Render
Discretize space and simulate
Decide where to place the smoke
Scene
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 DensityVelocity
NVIDIA Confidential
Fluid Simulation steps
Advect Advect
AddDensity
AddVelocity Project
Density
Velocity
Iterate
Pressure
Density DensityVelocity Velocity Velocity
Pressure
Each time step
* We skip the diffusion step
Initialize
NVIDIA Confidential
Advect
Velocity
Density
Time Step t
Time Step t + 1
Density
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
NVIDIA Confidential
Advect on the GPU
Density Texture at timestep t
Velocity Texture at timestep t
rasterized rendered
Texture fetch Texture fetch
Render TargetDensity 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
Vel
ocity
in y
NVIDIA Confidential
Texture fetchTexture 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 TargetDensity for timestep t+1
N Quads
M
O
M
OM
PS_ADVECT
calculate new
density for this grid
cell using the
density and velocity
textures from the
previous time step
N
OM
N
O
N
NVIDIA Confidential
Obstacles
Smoke interacting with
obstacles and compositing with the sceneSmoke only compositing with the scene
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
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
NVIDIA Confidential
Boundary Conditions for Density
No density should be added to or advected into the interior of obstacles
Density Obstacles
NVIDIA Confidential
Boundary Conditions for Pressure
Derivative of the pressure across the boundary should be zero
(Neumann boundary conditions - specifying derivative )
cell1
u
vcell2
PressureCell1 – PressureCell2 = 0
PressureCell1 = PressureCell2
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
NVIDIA Confidential
Voxelizing an object
Obstacle texture
Obstacle Velocity texture
NVIDIA Confidential
Use low res collision model for voxelization
NVIDIA Confidential
Voxelizing a simple object
?
NVIDIA Confidential
Voxelizing a simple object
Orthographic camera
Near plane
Far plane
Stencil Buffer
Decrement on back faces Increment on front faces
NVIDIA Confidential
Voxelization
… … …
2DArray of N stencil buffers
Render model N times, each time with a different near plane
NVIDIA Confidential
Part III - RenderingOutline
Ray marching
Occluding the scene
Artifacts and ways to avoid them
NVIDIA Confidential
Rendering
Render front faces of box
Raycast into the3D Density texture
Composite into scene
NVIDIA Confidential
Raycasting into 3D texture
What we have What 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
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 samplefrom 3D texture
Render Fullscreen quad to frame buffer
RayDataTexture
PositionInTexture = TransformToTexSpace(RayDataTexture.rgb)
MarchingVector = TransformToTexSpace(eye - RayDataTexture.rgb)
NumberOfSamples = TransformToGridSpace(RayDataTexture.a)
NVIDIA Confidential
Occluding the scene
Smoke correctly compositing with the scene
Smoke directly blended on top of the scene
NVIDIA Confidential
Integrating scene depth
NVIDIA Confidential
Artifacts
During the ray-marching use jittering to avoid banding
Without jittering With jittering
NVIDIA Confidential
Jittered sampling
During the ray-marching use jittering to avoid banding
NVIDIA Confidential
ArtifactsIncrease sampling rate to reduce a noise caused by jittering
Increasing sampling rate leads to performance loss
Low sampling rate High sampling rate
NVIDIA Confidential
Artifacts
Correctly using the depth by weighted samplingArtifacts resulting from an integral number of samples
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
NVIDIA Confidential
Combining techniques
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 informationNVIDIA DirectX10 SDK code sample
Upcoming GPU Gems3 article
NVIDIA Confidential
Questions?