Traçado de Raios de Cenas Dinâmicas na GPU Autor: Paulo Ivson Netto Santos Orientador: Waldemar Celes Filho 23 de Março de 2009 [email protected] Sumário Motivação Estado da Arte Contribuições do Trabalho Construção da Grade Uniforme Traçado de Raios Resultados Conclusão Trabalhos Futuros 2 Motivação Por que o traçado de raios? Por que usar a GPU? Vantagens Eficiência O(log(n)) na complexidade da cena Descarte de visibilidade e oclusão Instanciação Imagens: [Wald et al. 2003] 4 Vantagens Alta qualidade de imagem Efeitos de sombreamento Cálculos fisicamente corretos Iluminação Global Imagens: [Wald et al. 2003] 5 Iluminação Global Imagens: [Wald et al. 2003] 6 Placa Gráfica GPUs se tornaram eficientes e flexíveis Centenas de processadores em paralelo Suporta precisão de 32-bits de ponto flutuante Oferece muitos GFLOPS GFLOPS G80 = GeForce 8800 GTX G71 = GeForce 7900 GTX G70 = GeForce 7800 GTX NV40 = GeForce 6800 Ultra NV35 = GeForce FX 5950 Ultra NV30 = GeForce FX 5800 Placas gráficas em cada PC e estação de trabalho Imagens: Nvidia 7 Desafios Constantes enormes 1 raio ~ 1.000 ciclos da CPU Precisa de muitos raios ~1M pixels/quadro 4x anti-serrilhamento 25 quadros/seg 10 raios/pixel Um bilhão de raios por segundo… Sem hardware especializado Rasterização tem evoluído há 20 anos! Sem API unificada OpenGL vs OpenRT 8 Estado da Arte Como obter desempenho interativo Explorar Paralelismo Agrupar raios próximos Instruções SIMD Raios primários Utilizar vários processadores Clusters de PCs Placas gráficas 10 Reduzir Interseções Interseção com primitivas 90% do processamento Estrutura de Aceleração (EA) Minimizar interseções Trocar pelo custo de percorrer a estrutura Reduzir complexidade do algoritmo O(n) → O(log(n)) 11 Cenas Dinâmicas Movimento de corpo rígido Animação estruturada Transformar raio para espaço local do objeto Pré-construir EAs para cada quadro-chave Deformar volumes envolventes da EA Não estruturada Reconstruir ou adaptar EA a cada quadro 12 Trabalhos Relacionados CPU Ray Tracing Animated Scenes using Coherent Grid Traversal [Wald et al. 2006] Ray Tracing Deformable Scenes using Dynamic Bounding Volume Hierarchies [Wald et al. 2007] Highly Parallel Fast KD-Tree Construction for Interactive Ray Tracing of Dynamic Scenes [Shevtsov et al. 2007] GPU Real-Time KD-Tree Construction on Graphics Hardware [Zhou et al. 2008] 13 Contribuições do Trabalho Solução proposta Objetivos Explorar paralelismo da GPU Cenas dinâmicas Movimento de corpo rígido Deformações Movimento não-estruturado Estrutura de Aceleração Grade Uniforme Reconstruir quando houver movimento 15 Algoritmos na GPU Construção da Grade Uniforme em paralelo Percurso e interseção de raios Cálculo de sombreamento Texturas Sombras Reflexões 16 Resumo da Solução Cena Materiais Coords Tex Normais Vértices Configurar grade Inicialização Visualização Novo quadro-chave? laço principal sim Enviar dados para GPU não Traçar raios Reconstruir grade 17 Construção da Grade Uniforme Implementação em paralelo Algoritmo Básico 1. 2. 3. 4. Encontrar AABB da cena kN kN Nx dx3 Nz dz3 Ny dy3 Determinar no. de células V V Construir listas de triângulos contidos em cada célula Construir índice ID célula → lista de primitivas 0 ID célula (1) 2 6 kN V 11 15 22 Início da lista atual Início da próx. lista (2, 6) Percurso de Raios ID primitivas (7, 1, 3, 9) 3 2 7 1 3 9 11 6 2 4 5 7 4 6 8 8 3 7 5 13 12 11 14 21 5 19 Desafios em Paralelo Como paralelizar a construção das listas? Por primitiva Por célula Conflitos de escrita na mesma célula Inúmeros acessos a muitos dados Como construir índice para as listas? Determinar início e tamanho de cada lista 20 Observação Difícil Obter primitivas ocupadas por cada célula Fácil Obter células ocupadas por cada primitiva 21 Idéia Fundamental Escrever pares (ID célula, ID primitiva) Ordenados por ID primitiva Reordenar pares de acordo com ID célula (ID célula, ID primitiva) 4 7 9 7 13 7 14 7 9 12 10 12 4 5 4 8 10 2 14 8 Ordenar por ID célula 4 5 4 7 4 8 9 7 9 12 10 2 7 10 12 13 14 7 14 8 22 Algoritmo 1. 2. 3. 4. 5. Obter quantas células cada primitiva ocupa Acumular valores da Etapa 1 Escrever pares (ID célula, ID primitiva) usando índices da Etapa 2 Ordenar pares da Etapa 3 Dado ID célula, encontrar sua lista dentre pares ordenados da Etapa 4 23 Etapa 1 Objetivos Implementação Obter quantas células cada primitiva ocupa Fragment shader Estimativa pela AABB de cada triângulo Escrever total de células em cada pixel Exemplo 24 Etapa 2 Objetivos Implementação Acumular valores da Etapa 1 Índices para listas de células ocupadas por primitiva Soma de prefixos em paralelo CUDA Data-Parallel Primitives (CUDPP) Acumular um valor adicional no final Exemplo 25 Etapa 3 – Considerações Objetivos Escrever pares (ID célula, ID primitiva) Usar índices acumulados da Etapa 2 Uma operação de escrita Várias operações de escrita Uma passada Fragment shader CUDA Geometry shader Várias passadas Vertex shader - 26 Etapa 3 – Solução Proposta Dado ID par na saída Dentre os valores da Etapa 2 Obter ID célula e ID primitiva Busca binária pelo maior valor Vmáx menor que ID par ID primitiva = índice de Vmáx na Etapa 2 ID célula = ID célula inicial + (ID par – Vmáx) Exemplo 27 Etapa 4 Objetivos Implementação Ordenar pares da Etapa 3 de acordo com ID célula CUDA Radix-sort Exemplo 28 Etapa 5 Objetivos Implementação Construir índices para acessar listas da Etapa 4 Busca binária pelo ID célula nas listas ordenadas Obter início e tamanho de cada lista Fragment shader Exemplo 29 Vantagens Paralelismo Banda de memória Sem conflitos de escrita Sem múltiplos valores de saída Poucos acessos a dados Implementação eficiente na GPU Soma de prefixos Ordenação Busca binária 30 Traçado de Raios Implementação na GPU Algoritmo Conceitual Materiais Novo quadro-chave? sim Enviar dados para GPU Coords Tex Normais Vértices não Inicializar percurso de raios Cor de fundo não não Obter próx. célula nãovazia Reconstruir grade Dados da Grade Índices da Grade Índices da Grade sim Obter interseção mais próxima sim Vértices Dados da Grade Materiais sombra, reflexão Sombreamento Coords Tex Normais 32 Rotinas Principais Percurso de raios Interseção raio x triângulo 3D-DDA [Amanatides and Woo 1987] Coordenadas baricêntricas [Möller and Trumbore 1997] Sombreamento Phong + texturas Raios de sombra Raios de reflexão 33 Implementação na GPU Várias etapas Raios primários interseções Raios de sombra interseções em sombra cor final Sombreamento Reflexão: passada adicional com blend 34 Resultados Análise de desempenho Roteiro Construção da Grade Uniforme Cenas de Teste Desempenho Cenas Estáticas Cenas Dinâmicas Trabalhos Relacionados Etapas de Visualização Configuração de testes Nvidia GeForce 8800 Ultra Resolução de 1024 x 1024 36 Construção da Grade Uniforme Tempo para reconstrução (ms) De 2x a 3x mais rápido que CPU Lento para cenas pequenas (API gráfica) 37 Cenas de Teste - CAD MonoBR (112K tris) P40 (470K tris) Boat (50K tris) 38 Cenas de Teste - Benchmarks Hand (16K tris) Ben (78K tris) Wood-doll (5K tris) 39 Cenas de Teste - Benchmarks Toys (11K tris) Forest (174K tris) Marbles (9K tris) 40 Cenas Estáticas - CAD Quadros por segundo (fps) Resultados P-40 Sombras Escalabilidade Descarte por oclusão Cerca de 50% mais lento Reflexões Pior para modelos grandes 41 Cenas Estáticas - Benchmarks Quadros por segundo (fps) “Forest” é pior caso para Grade Uniforme “Teapot in a stadium” Sombras Até 50% mais lento Reflexões Até 85% mais lento “Forest” pior (modelo grande) 42 Cenas Dinâmicas - Benchmarks Quadros por segundo (fps) Reconstrução da Grade Uniforme Custo pequeno (-10%) Exceto “Forest” (-30%) 43 Trabalhos Relacionados Quadros por segundo (fps) Desempenho até 4x mais rápido que BVH e Grade na CPU “Toys” Melhor que CPU kd-tree e pior que GPU kd-tree “Forest” Pior que ambas pesquisas com kd-tree 44 Etapas de Visualização Tempo de cada etapa (ms) Enviar dados para GPU é rápido Construção da Grade mais rápida que CPU Kd-tree mais lenta para ser construída Gargalo: etapa de traçado de raios 45 Demonstração Vídeos 46 Conclusão Revisão dos resultados e proposta inicial Objetivos Atingidos Construção da Grade Uniforme na GPU Implementação em paralelo Rápida e escalável Traçado de raios de cenas dinâmicas Desempenho interativo Sombras, reflexões 48 Contribuições Construção da Grade Uniforme na GPU Mais rápido que pesquisas similares na CPU Traçado de raios na GPU Mais rápido que Grade e BVH na CPU Cenas esparsas Mais lento que kd-tree na CPU e GPU Várias melhorias possíveis 49 Trabalhos Futuros Melhorias e novas pesquisas Próximos Passos Grades hierárquicas Várias Grades (movimento de corpo rígido) Distância até próxima célula ocupada Outras estruturas na GPU (BIH, BVH) Traçar pacotes de raios Simulação física 51 Bibliografia AMANATIDES, J.; WOO, A. A fast voxel traversal algorithm for ray tracing. In: IN EUROGRAPHICS '87, p. 3-10, 1987. MOLLER, T. A.; TRUMBORE, B. Fast, minimum storage ray-triangle intersection. JGTOOLS: Journal of Graphics Tools, 2, 1997. SHEVTSOV, M.; SOUPIKOV, A. ; KAPUSTIN, A. Highly parallel fast kd-tree construction for interactive ray tracing of dynamic scenes. Comput. Graph. Forum, 26(3):395-404, 2007. WALD, I.; PURCELL, T. J.; SCHMITTLER, J.; BENTHIN, C. ; SLUSALLEK, P. Realtime Ray Tracing and its use for Interactive Global Illumination. In: Eurographics State of the Art Reports, 2003. WALD, I.; IZE, T.; KENSLER, A.; KNOLL, A. ; PARKER, S. G. Ray Tracing Animated Scenes using Coherent Grid Traversal. ACM Transactions on Graphics, p. 485-493, 2006. (Proceedings of ACM SIGGRAPH 2006). WALD, I.; BOULOS, S. ; SHIRLEY, P. Ray Tracing Deformable Scenes using Dynamic Bounding Volume Hierarchies. ACM Transactions on Graphics, 26(1), 2007. ZHOU, K.; HOU, Q.; WANG, R. ; GUO, B. Real-time kd-tree construction on graphics hardware. In: SIGGRAPH ASIA '08: ACM SIGGRAPH ASIA 2008 PAPERS, p. 1-11, New York, NY, USA, 2008. ACM. 52