TRAZA DE RAYOS EN TIEMPO REAL

TRAZA DE RAYOS EN TIEMPO REAL
Rendering Avanzado
Jorge Lopez Moreno
23 de Marzo de 2015
Index
Aceleración de Ray Tracing – Run, run Forrest, Run!
Raytracing en GPU
Hot in games: Voxel Cone Tracing
Alternativas


Screen Space Directional Occlusion
Distance Fields
Acelerando Ray Tracing
Repaso general (Kayvon Fatahalian’s course at CMU)


Paquetes de rayos
Recorrido de árboles
Referencias de Interés
Embree  Raytracer de Intel
Trabajos de Stefan Popov (Stackless Traversal of KD
trees)
Sobre SIMD ray tracing (Jacco Bikker):

http://software.intel.com/en-us/articles/interactive-ray-tracing
Ray tracing en GPU
En GPU debemos recordar que no tenemos
stack.  pensar de forma diferente.
Ejemplo: Path tracing in the GPU (Iñigo Quilez)
Ray tracing en GPU (video)
GPU Path tracer
Idea: No tenemos stack. ¿Cómo calculamos la
iluminación indirecta?
No usamos recursión. Iteramos, cambiando la
posición y dirección inicial del rayo, en función
de la iteración anterior
GPU Path tracer
Codigo para calcular color (basico):
vec3 rendererCalculateColor( vec3 ro, vec3 rd, int numLevels )
{
// intersect scene
vec2 tres = worldIntersect( ro, rd, 1000.0 );
// if nothing found, return background color
if( tres.y < 0.0 )
return worldGetBackground( rd );
// get position and normal at the intersection point
vec3 pos = ro + rd * tres.x;
vec3 nor = worldGetNormal( pos, tres.y );
// get color for the surface
vec3 scol = worldGetColor( pos, nor, tres.y );
// compute direct lighting
vec3 dcol = worldApplyLighting( pos, nor );
…
GPU Path tracer
Codigo para calcular color (recursivo):
vec3 rendererCalculateColor( vec3 ro, vec3 rd, int numLevels
)
{
// after some recursion level, we just don't gather more light
if( numLevels==0 ) return vec3(0.0);
// compute direct lighting
vec3 dcol = worldApplyLighting( pos, nor );
// compute indirect lighting: get new direction, call recursion
rd = worldGetBRDFRay( pos, nor, rd, tres.y );
vec3 icol = rendererCalculateColor( pos, rd, numLevels-1 );
// intersect scene
vec2 tres = worldIntersect( ro, rd, 1000.0 );
// surface * lighting
vec3 tcol = scol * (dcol + icol);
// if nothing found, return background color
if( tres.y < 0.0 )
return worldGetBackground( rd );
// get position and normal at the intersection point
vec3 pos = ro + rd * tres.x;
vec3 nor = worldGetNormal( pos, tres.y );
// get color for the surface
vec3 scol = worldGetColor( pos, nor, tres.y );
return tcol;
}
GPU Path tracer
Codigo para calcular color (iterativo):
vec3 rendererCalculateColor( vec3 ro, vec3 rd, int numLevels )
{
vec3 tcol = vec3(0.0);
vec3 fcol = vec3(1.0);
vec3 nor = worldGetNormal( pos, tres.y );
// get color for the surface
vec3 scol = worldGetColor( pos, nor, tres.y );
// create numLevels light paths iteratively
for( int i=0; i < numLevels; i++ )
{
// intersect scene
vec2 tres = worldIntersect( ro, rd, 1000.0 );
// if nothing found, return background color or break
if( tres.y < 0.0 )
{
if( i==0 ) fcol = worldGetBackground( rd );
else
break;
}
// get position and normal at the intersection point
vec3 pos = ro + rd * tres.x;
// compute direct lighting
vec3 dcol = worldApplyLighting( pos, nor );
// prepare ray for indirect lighting gathering
ro = pos;
rd = worldGetBRDFRay( pos, nor, rd, tres.y );
// surface * lighting (decaimiento exponencial)
fcol *= scol;
tcol += fcol * dcol;
}
return tcol;
}
GPU Path tracer
Resultado para una luz (y un par de rebotes)
Optix
Engine de ray tracing en tiempo real de Nvidia
basado en CUDA
Optix
Se definen programas para paquetes de
rayos:
 Cómo se generan los rayos (paralelos,
perspectiva, campo de gradiente)
 Cómo tratar rayos perdidos
 Bounding Box ( test de intersección con BB,
KDtree, etc)
Hit (intersección)  material
Buffers de comunicación con CPU
Jerarquía de Geometría
Optix
Usado en render engines como Katana (Pixar) o
Furryball
Optix (Video katana)
Ray tracing en GPU
Webs recomendadas:




http://raytracey.blogspot.com.es/
http://www.sjbrown.co.uk/
http://cudapathtracer.blogspot.com.es/
http://cudaraytracer.blogspot.com.es/
Voxel Cone Tracing
Recordemos que la iluminación indirecta es costosa y
necesaria para alcanzar un minimo realismo
Voxel Cone Tracing
Aunque no tanto si buscamos atajos…
Voxel Cone Tracing
Voxel Cone Tracing
Se ha probado con éxito en juegos (EPIC Games SVOgi)
Voxel Cone Tracing
Se ha probado con éxito en juegos (EPIC Games SVOgi)
Voxel Cone Tracing
Voxel Cone Tracing
Aproximamos la geometría con Sparse Voxel Octree
Voxel Cone Tracing
Estructura GPU Voxel Octree
Nodos conectados en memoria lineal de la GPU (Octree
pool):


Tiles de 2x2x2 nodos
1 puntero por nodo a cada nodo-tile
Voxels almacenados en textura 3D (brick pool)

Permite interpolación trilineal por
hardware.
Voxelizar
Metodo recomendado [OpenGL Insights: Sparse Voxelization]


Un solo pase de shader geométrico
OpenGL 4.3 Direct acces to texture
Construir el Octree
8 nodos agrupados en bricks + textura 3D almacenando
radiancia (si no es difusa necesitas más almacenaje)
En el child node se almacena le puntero al brick con la
radiancia
Alternativa a construir el octree
Tenemos los datos en textura 3D…¿por que no usar
mipmaps directamente?

Desventaja: limitado a espacio de memoria VRAM
Mejora, orientar la textura con la dirección de trazado
del cono  intersección sencilla

Desventaja: requiere direcciones uniformes para todos los
fragment shaders
Mejora compresión de textura

Desventaja: perdida de FPS por acceso a la misma
Pipeline de Render
Es un pipeline híbrido:

Los rayos primarios se rasterizan (aprovecha el pipeline GPU,
muy optimizado para calcular visibilidad directa)

Los rayos secundarios se trazan con conos, flexible y
escalable.
Forward / deferred rendering
Trazado de Conos
Se hace un prefiltrado de la
geometría, trazando como en
medios participativos


Raycasting de volúmenes
Calculamos radiancia en función de
normal/ luz
En cada voxel:


Radiancia recibida
Opacidad
Algoritmo de Render
1.
Pasada de iluminación (light
pass)

Precálculo de Irradiancia (luz
emitida directa)
2. Pasada de filtrado (filter pass)

Downsample radiancia en el
octree.
3. Pasada de cámara (camera pass)

Para cada fragmento visible:
recoger (gather) la radiancia
indirecta.
Algoritmo de Render
Solo una vez para geometría estática
Escena luz directa
1) Voxelizar mesh
2) Construir Octree
Una vez por cada Frame
3) Inyectar luz directa
4) Filtrar luz a mipmap
5) Trazar conos (mipmap)
Rasterizar rayos primarios
Pasada de iluminación
Se renderiza el shadow map desde el punto de vista de
la luz (cascade shadow maps).
Por cada pixel del shadow map reconstruimos la
posición del mundo de ese téxel.
Atravesamos con la posición el octree hacia abajo, para
obtener la radiancia reflejada y la almacenamos en la
textura 3D (3D bricks)
Pasada de filtrado (filter pass)
Filtrado hecho a mano, anisotrópicamente en X, Y y Z
Por ejemplo para E, usamos g, h, i, l, m, n, q, r, s
Pasada de filtrado (filter pass)
Subdividimos en bloques, hacemos alpha blend en eje X
y después hacemos la media (average)
Las esquinas se tratan de forma especial
Pasada de filtrado (filter pass)
Visualmente dos niveles (derecha filtrado a partir dela
izquierda)
Calcular Radiancia (trazar conos)
Ejemplo para Ambient Occlusion (AO). Calculamos la
integral como suma de conos.
Calcular Radiancia (trazar conos)
Cada cono tiene un peso. Por ejemplo 6 conos con
cobertura de 60 grados.
¿Por qué W1 es diferente?
Calcular Radiancia (trazar conos)
Para calcular la visibilidad cogemos múltiples muestras de
los bricks de la textura 3D en la dirección de cada cono
¿Cómo tomámos las muestras para no ser afectados por
mipmapping?
Calcular Radiancia (trazar conos)
Simplificación, se toman muestras en cada nivel del
mipmap. Asumimos voxels esféricos, y tomamos el punto
con tamaño de voxel igual al radio del cono en ese punto.
Calcular Radiancia (trazar conos)
Para iluminación indirecta lo mismo:
Especular: con un cono de ángulo proporcional a gloss (g)
Ventajas e Inconvenientes
Es una representación luz escalable


Independiente de la geometría
Control del tiempo de render
Desventaja: tamaño de los conos

Precisión vs light leaking
En cualquier caso:

suave y sin ruido
Ejemplo: luz indirecta difusa
Ejemplo: luz indirecta difusa
Trazado de especulares
Trazado de especulares
Trazado de especulares
Trazado de especulares
Rebotes de Luz
Voxel Ambient Occlusion
Oclusiones
distantes y
off-screen
disponibles
Depende de
la resolución
Sombras Suaves
Un cono por pixel

Cuanto más suave más facil! (usamos mipmaps en el
octree de voxels).
Sombras Suaves
Sombras Suaves
Posibles problemas
Si usamos iluminación directa con shadow maps en
cascada problemas de resolución
Posibles problemas
Si usamos iluminación directa con shadow maps en
cascada:


cuidado con imprecisión al localizar los voxels (slope cascade
bias disabled)
Estabilizar el shadow map (que su calculo sea estable a pesar
de la posición de cámara.
Posibles problemas
Light leaking: Si el tamaño del voxel es demasiado grande para el
Angulo del cono, podemos atravesar objetos finos.
Solución:



Más resolución de vóxels
Menos conos
Ambient Occlussion
Extras
Podemos añadir BSDF’s más complejas
Tecnicas Alternativas
Screen Space
Directional Occlusion
SSDO (2009)

Extended Ambient
Occlusion
Ray marching Distance
Fields


Ray marching con
optimización en la
función de distancia
http://www.iquilezles.or
g/www/articles/raymarc
hingdf/raymarchingdf.h
tm
Tecnicas Alternativas
Ray marching Distance Fields
Tecnicas Alternativas
Screen Space Directional Occlusion
Referencias
Interactive indirect illumination using voxel cone tracing
C.Crassin, F. Neyret, M. Sainz, S. Green, E. Eisemann Computer
Graphics Forum
GigaVoxels (http://maverick.inria.fr/Publications/2009/CNLE09/CNLE09.pdf)
Simon Yeung’s AlDevBlog
(http://www.altdevblogaday.com/2013/01/31/implementing-voxel-cone-tracing/)






The Technology Behind the “Unreal Engine 4 Elemental demo”
http://www.unrealengine.com/files/misc/The_Technology_Behind_the_Elemental_Demo_16x9_(2).pdf
Octree-Based Sparse Voxelization Using the GPU Hardware Rasterizer
http://www.seas.upenn.edu/%7Epcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf
GPU Gems 2: Conservative Rasterization
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter42.html
Shading in Valve’s Source Engine
http://www.valvesoftware.com/publications/2006/SIGGRAPH06_Course_ShadingInValvesSourceEngine.pdf
Perpendicular Possibilities http://blog.selfshadow.com/2011/10/17/perp-vectors/
A couple of notes about Z http://www.humus.name/index.php?ID=255
Referencias (extra de hoy)
Sobre cámaras y raytracing



Así es como se simula de forma correcta:
http://web.cs.wpi.edu/~emmanuel/courses/cs563/S07/projects
/lens.pdf
Así es como os propuse: http://cg.skeelogy.com/depth-offield-using-raytracing/
Ejemplo y código: http://ray-tracerconcept.blogspot.com.es/2011/12/depth-of-field.html