Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMaria Jeronimo Alterado mais de 10 anos atrás
1
Traçado de raios em tempo real Paulo Ivson 20-10-2008
2
Sumário Algoritmo convencional Problemas Grade Regular Kd-tree
3
Algoritmo convencional Para cada raio da imagem Para cada objeto na cena Calcular interseção raio x objeto Guardar interseção mais próxima Se houve interseção, calcular iluminação
4
Problemas Para cada raio da imagem Para cada objeto na cena Calcular interseção raio x objeto Guardar interseção mais próxima Se houve interseção, calcular iluminação Processamento custoso Divisões de ponto flutuante Cálculo de raiz quadrada etc
5
Problemas Para cada raio da imagem Para cada objeto na cena Calcular interseção raio x objeto Guardar interseção mais próxima Se houve interseção, calcular iluminação Complexidade O(rn) Busca em força bruta pela interseção mais próxima
6
Problemas Para cada raio da imagem Para cada objeto na cena Calcular interseção raio x objeto Guardar interseção mais próxima Se houve interseção, calcular iluminação Cerca de 90% do tempo é gasto no cálculo de interseções Sem chance de ser tempo real
7
Solução Otimizar cálculo de interseções Pré-calcular divisões Evitar raiz quadrada Reduzir complexidade do algoritmo O(rn) O(r lg n)
8
Estrutura de Aceleração Índice espacial Encontrar geometria mais próxima ao longo de um raio Da forma mais eficiente possível Objetivo Trocar custo de interseção pelo custo de percurso na estrutura
9
Estuturas mais bem-sucedidas Grade regular Kd-tree BVH* Queremos Boa adaptação (teapot in a stadium) Percurso de raios eficiente Construção eficiente*
10
Mas antes, volumes envolventes
11
AABB (revisão) Construção O(n) Para cada vértice Armazenar mín. e máx. para coordenadas x, y e z Ajuste nem sempre bom Mas suficiente para o traçado de raios
12
Estruturas de aceleração
13
Grade Regular Subdivisão espacial Regular Não-adaptativa Células de tamanho uniforme Largura, altura e profundidade Não precisam ser iguais entre si São iguais para todas as células Aplicações principais Busca por vizinhos próximos Traçado de raios
14
Representação vec3 boxMin vec3 boxMax vec3 cellSize vec3 numCells int** data vec3 invCellSize
15
Construção 1. Encontrar AABB da cena 2. Determinar número de células 3. Para cada geometria Determinar quais células ela ocupa Complexidade O(n)
16
Determinar células ocupadas Dado ponto no espaço, qual célula ele ocupa? 1. Obter AABB da geometria 2. Determinar cellStart, cellEnd 3. Calcular interseção exata de cada célula com a geometria
17
Percurso de raios Similar à rasterização 3D-DDA Amanatides, J., Woo, A. A Fast Voxel Traversal Algorithm for Ray Tracing. In Eurographics 87. Eurographics Association, 3–10.
18
Percurso de raios Intervalos regulares em cada dimensão
19
Percurso de raios
20
Percurso de Raios 1. Inicialização Determinar célula inicial Calcular limites para percurso do raio 2. Percurso Determinar qual próxima célula a ser visitada Calcular interseção com triângulos Se encontrou interseção, retorna Senão, atualizar limites em cada dimensão Loop
21
kd-Tree Estritamente binária Um plano de corte por nó Alinhado com um dos eixos coordenados Posicionado arbitrariamente Distribuição irregular de geometrias Adapta-se melhor do que Octree Aplicações principais Busca por vizinhos próximos Traçado de raios
22
Construção 1. Testar critério de parada 2. Encontrar melhor plano de corte Eixo: alternado, maior extensão da caixa do nó Posição: mediana espacial, heurística 3. Classificar geometrias em cada lado do plano 4. Chamadas recursivas para cada nó filho Complexidade O(n lg n) Depende da heurística para encontrar plano de corte
23
Como encontrar plano de corte Eixo Alternado, ao longo da maior dimensão Posição Mediana espacial, mediana das geometrias, média das geometrias Término Mín. primitivas em uma folha, limite no tamanho da altura
24
Como encontrar plano de corte Eixo Alternado, ao longo da maior dimensão Posição Mediana espacial, mediana das geometrias, média das geometrias Término Mín. primitivas em uma folha, limite no tamanho da altura Não são recomendadas (usem como plano B)
25
Como encontrar plano de corte Melhor algoritmo atualmente Surface Area Heuristic Qual plano escolher? Aquele que for melhor para o traçado de raios Escreva função de custo e minimize ela Algoritmo guloso (solução ótima local)
26
Função de custo Qual custo de traçar um raio por um nó? Probabilidade de um raio qualquer atingir o nó Proporcional à área de superfície do nó Custo de interseção das primitivas contidas pelo nó Proporcional à quantidade de primitivas (aproximação) Cost(node) = c_trav + Prob(hit L) * Cost(L) + Prob(hit R) * Cost(R) = c_trav + c_intr * ( SA(L) * nPrim(L) + SA(R) * nPrim(R) )
27
Levando em conta o custo
28
Probabilidades de L & R iguais Não considera custos de L & R
29
Levando em conta o custo Custos de L & R iguais Não considera probabilidades de L & R
30
Partição otimizando custo Automaticamente isola complexidade Produz grandes regiões de espaço vazio
31
Onde avaliar função de custo Onde estão os pontos críticos? Variar áreas variação linear (contínuo) Variar nPrim degrau (discreto) Mínimo quando número de triângulos muda Utilizar limites das AABBs ou interseção exata Para cada dimensão x, y, z Avaliar custo de plano nos pontos críticos Guardar plano de menor custo
32
Critério de parada Quando terminar subdivisão? Considerar nó atual uma folha Vale a pena subdividir? CostLeaf(node) = c_trav + c_intr * nPrim(node) If CostLeaf(node) <= Cost(node) stop recursion
33
Representação Node É folha? + Eixo do plano de corte (0=x, 1=y, 2=z) 2 bits Posição do plano de corte 32 bit float Sempre dois filhos, colocar lado-a-lado na memória Um ponteiro de 32-bits Conseguimos 8 bytes?
34
Representação Node É folha? + Eixo do plano de corte (0=x, 1=y, 2=z) 2 bits Posição do plano de corte 32 bit float Sempre dois filhos, colocar lado-a-lado na memória Um ponteiro de 32-bits Conseguimos 8 bytes? Usar 2 bits menos significativos do ponteiro
35
kD-Tree Traversal Step split t_split t_min t_max
36
kD-Tree Traversal Step split t_split t_min t_max
37
kD-Tree Traversal Step split t_split t_min t_max
38
Passo do percurso Dado: ray P & iV (1/V), t_min, t_max, split_location, split_axis t_at_split = ( split_location - ray->P[split_axis] ) * ray_iV[split_axis] if t_at_split > t_min need to test against near child If t_at_split < t_max need to test against far child
39
Percurso de raios while ( not a leaf ) t_at_split = (split_location - ray->P[split_axis]) * ray_iV[split_axis] if t_split < t_min continue with far child // hit either far child or none if t_split > t_max continue with near child // hit near child only // hit both children push (far child, t_split, t_max) onto stack continue with (near child, t_min, t_split)
40
Considerações finais Usar float ao invés de double Pré-calcular valores Evitar divisões Evitar raiz quadrada Utilizar early exits Otimizar raios de sombra Interseção com alguma primitiva? Não precisam de informação de hit Muitas outras otimizações Pacotes de raios (SIMD) Representações paramétricas etc
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.