TRAZA DE RAYOS EN TIEMPO REAL
Transcription
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