Hardware assisted rendering of csg models Fabiano Segadaes Romeiro Orientadores: Luiz Velho Luiz Henrique de Figueiredo Motivação ► CSG: Modelagem hierárquica de objetos complexos ► Objetos gerados por combinações booleanas de primitivos simples Motivação ► Interatividade importante: é Facilita o processo de design do objeto Permite visualização por vários angulos. ► Porém é difícil: escalabilidade. Abordagens anteriores ► Boundary representations ► Depth-layering (Goldfeather) ► Recentemente: algoritmos que usam os recursos da GPU (Wiegand, Rappoport, Stewart, Guha, etc) ► Blist, Depth-peeling (Hable) Abordagens anteriores ► Abordagens mais recentes usando GPU são bandwith limited ► Depth-peeling e depth-layering usam o stencil buffer – limitação no número de primitivos Abordagem ► Superfícies de objetos CSG tem representação local simples ► Exceções são pontos pertencentes a interseção de superfícies de 3 ou mais primitivos Abordagem ► Dividir espacialmente o objeto até que: Em cada célula a representação seja simples Ou a célula corresponda a menos de um determinado número de pixels ► Renderizar cada célula na GPU por traçado de raios Subdivisão Espacial ► Octree é usada para obter células com representação local simples ► Célula inicial: bounding box do objeto ► Cada célula da octree mantém a representação local simplificada da restrição do objeto à célula em questão Subdivisão Espacial ► Subdivisão em uma dada célula pára quando: Representação local é simples o suficiente Célula não contém superfície do objeto csg Célula ocupa menos de determinado número de pixels na tela Subdivisão Espacial – Obtenção da representação local simplificada ► Procedimento recursivo simplifica a representação em cada célula usando a representação simplificada de sua célula pai como ponto de partida Subdivisão Espacial – Obtenção da representação local simplificada ► Procedimento testa interseção da célula com primitivos na representação local associada a ela. ► Seguindo uma série de regras de redução a representação é simplificada. Subdivisão Espacial ► Após construída a octree ela é percorrida de maneira front-to-back. ► Cada célula cuja representação simplificada é não-nula e não contém mais de 3 primitivos tem o objeto csg formado pela sua representação simplificada renderizada na GPU Traçado de raios na GPU ► Existem diversas abordagens recentes para o traçado de raios na GPU ► Extensão do traçado de raios de primitivos de Toledo et al para traçado de raios de operações booleanas entre dois primitivos Traçado de raios na GPU - primitivos ► Bounding box do primitivo é renderizada e vertex e pixel shaders apropriados são carregados ► Em cada pixel das faces das bounding boxes o pixel shader determina se o raio partindo da camera até o pixel em questão intersecta ou não o primitivo. ► Caso afirmativo o cálculo do shading é realizado Traçado de raios na GPU - primitivos ► Para renderizar a restrição de primitivos a uma determinada célula: Renderizada a restrição do bounding box do primitivo à célula e para cada pixel Segmentos do raio que intersectam o primitivo e a célula são intersectados para obter o segmento determinante Dependendo do segmento resultante o pixel é descartado ou renderizado após sua cor ser calculada. Traçado de raios na GPU – operações booleanas de primitivos ► Modificações primitivos: em cima do algoritmo para Complemento Interseção Diferença União Modelagem e visualização interativa ► Importante: CAD e engenharia de partes Modelagem e visualização interativa ►A medida que o objeto CSG é visualizado podem ocorrer: ► Mudanças de iluminação ► Mudanças no objeto CSG ► Mudanças na localização/direção da camera Modelagem e visualização interativa ► No caso em que o objeto se altera: Somente é necessário recalcular a octree nas partes em que o objeto se alterou Renderizar novamente somente estas partes. ► Otimização: verificar se células estão oclusas antes de renderiza-las ► Dificuldade: realizar um occlusion query pode não compensar tendo em vista que o mesmo introduz stalls no pipeline da GPU. SOLUÇÃO: abordagem hierarquica Resultados ► Testes realizados com objetos representativos do uso comum de CSG ► Enfoque dado a performance da operação mais complexa (diferença) ► Verificação de corretude - realizadas comparações com o povray ► Escalabilidade testada usando-se modelos de crescente complexidade Resultados Resultados Resultados ► Performance mostrou-se, como esperado, dependente de dois fatores: Complexidade de profundidade Área ocupada pelo objeto na tela Resultados – occlusion queries Resultados – occlusion queries Resultados – occlusion queries Resultados – occlusion queries Resultados – occlusion queries ► Mais útil em determinados viewpoints ► Maior impacto em GPUs mais lentas ► Nível hierárquico ótimo em que testar para oclusão varia – processo de otimização que detecte nível ótimo geraria constante ganho de performance independente de viewpoint. Resultados - corretude Resultados - corretude Resultados - corretude Resultados - corretude ► Quase nenhum artefato visível ► Artefatos existem onde são esperados: nos pontos pertencentes a superfícies de 3 primitivos diferentes Conclusões ► Abordagem mais dependente de instruction throughput do que bandwidth em modelos razoavelmente complexos ► Modelos muito complexos começam a ser limitados pela CPU e pela CPU/GPU bandwidth Trabalhos futuros ► Inter-object shadows ► rocedimento de otimização para occlusion queries ► Volumetric rendering ► Mais primitivos