A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Descarte por visibilidade

Apresentações semelhantes


Apresentação em tema: "Descarte por visibilidade"— Transcrição da apresentação:

1 Descarte por visibilidade
Paulo Ivson

2 Temos site! www.tecgraf.puc-rio.br/~psantos Aulas Códigos fonte
Exemplos Bibliotecas Material de pesquisa (e.g. papers)

3 Sumário Motivação Vdlib Descarte contra o volume de visão
Descarte por oclusão Resultados de desempenho

4 Motivação Por que visibilidade?

5 Motivação P-38 objetos vértices

6 Motivação Diminuir quantidade de dados transferidos
Eliminar objetos não-visíveis para o observador Não contribuem para a imagem final Diminuir quantidade de dados transferidos Reduzir processamento no hardware

7 Vdlib Visibility Determination Library Volumes envolventes
Volumes envolventes AABB OBB Construção de hierarquia Kd-tree, média das geometrias Descarte por visibilidade Volume de visão Oclusão

8 Descarte contra o volume de visão

9 Descarte contra o volume de visão
Objetivo Identificar objetos fora do frustum de visão Seriam descartados no HW (teste de clipping) Efetuar teste na CPU Antes de enviar geometria para GPU Qual teste podemos fazer?

10 Descarte contra o volume de visão
Frustum Tronco de pirâmide Pode ser definido pela interseção de 6 planos Near, far, left, right, top, bottom Convenção: planos orientados para dentro Como testar uma geometria? Testar seu volume envolvente! Determinar se este se encontra dentro ou fora do frustum

11 Descarte contra o volume de visão
Se volume envolvente está totalmente fora Descartar geometria Senão, continuar testando outros planos

12 Como obter planos do frustum?
A partir da matriz projection Plano definido no espaço do olho A partir da matriz view * projection Plano definido no espaço global Idéia Obter planos a partir do espaço de clipping Cubo → maís fácil de extrair planos Vide aula de pipeline de geometria Material no site Seção “Frustum Culling”

13 Teste AABB x Plano p-vertex n-vertex p = (xmin,ymin,zmin)
if (normal.x >= 0) p.x = xmax; if (normal.y >=0)) p.y = ymax; if (normal.z >= 0) p.z = zmax; n-vertex n = (xmax,ymax,zmax) if (normal.x >= 0) n.x = xmin; if (normal.y >=0)) n.y = ymin; if (normal.z >= 0) n.z = zmin;

14 Teste AABB x Plano Se p-vertex está do lado negativo
Caixa está totalmente fora Se n-vertex está do lado positivo Caixa está totalmente dentro

15 Teste OBB x Plano Descrever plano no espaço local da caixa
n: normal do plano b: base ortonormal da OBB nb = (bx . n, by . n, bz . n) Usar nb para determinar n-vertex e p-vertex

16 Teste OBB x Plano (2) Separating Axis No caso da OBB x Plano
“Two convex curves will not curve around each other. Thus, if separated there will be a gap into which a plane can be inserted. A separating axis is a line perpendicular to this plane. Objects projected on the axis give non-overlapping intervals if objets do not intersect.” No caso da OBB x Plano O plano de separação é paralelo ao plano sendo testado O eixo de separação é paralelo à normal do plano sendo testado

17 Teste OBB x Plano (2) int IntersectionBetween( const Plane& plane, const Box& box ) { const float projectedCenter = DistanceBetween( box.center, plane ); const float projectedRadius = abs( plane.normal.dot( box.axis[0] ) * box.extents[0] )+ abs( plane.normal.dot( box.axis[1] ) * box.extents[1] ) + abs( plane.normal.dot( box.axis[2] ) * box.extents[2] ); // Totally inside if( projectedCenter >= projectedRadius ) return +1; // Totally outside if( projectedCenter <= ( -projectedRadius ) ) return -1; // Intersected return 0; }

18 Otimizações Evitar testar todos os planos contra todos os volumes envolventes De um quadro para o outro, câmera não costuma se mover bruscamente Será que podemos agrupar testes? Idéia: hierarquias!

19 Coerência temporal Para cada geometria, guardar índice do último plano a descartá-la Testar primeiro este plano Boa chance de descartar novamente geometria

20 Coerência espacial Dado um conjunto de geometrias
Se seu volume envolvente está totalmente fora de um plano, descartar todas as geometrias Se seu volume envolvente está totalmente dentro de um dos planos, não testar volumes menores contra este plano Se totalmente dentro do frustum, não é preciso testar contra nenhum plano Senão, é necessário testar volumes menores

21 Coerência espacial Construir hierarquia de uma cena
Testar volume envolvente do nó pai Guardar máscara de quais planos ainda precisam ser testados Ao visitar nó filho, verificar máscara do nó pai Se indica que está totalmente dentro do frustum → não testar nenhum plano Se indica que está totalmente dentro de um plano → não testar este plano Atualizar máscara para continuar percurso na hierarquia

22 Outras otimizações possíveis
Octantes Identificar qual octante um volume envolvente se encontra Testar somente contra 3 planos Translações e rotações Identificar objetos que permenecerão fora do frustum Projetar translação da câmera ao longo da normal do plano Guardar direção de rotação da câmera

23 Descarte por oclusão

24 Descarte por oclusão Cenas complexas → muitos objetos → oclusão

25 Descarte por oclusão Cells, Portals e PVS
Pré-computar visibilidade de regiões no espaço

26 Descarte por oclusão Shadow Frusta Hierarchical Z-Buffer
Hierarchical Occlusion Maps

27 Descarte por oclusão Descarte coerente hierárquico Mais uma vez
Utilizar placa gráfica para determinar oclusão Occlusion queries Explorar coerência temporal Explorar coerência espacial Mais uma vez Volumes envolventes! Hierarquias!

28 Occlusion Queries Extensão do OpenGL
int glCreateQuery( num ) void glBeginQuery( id, OCCLUSION_QUERY ) Draw(); void glEndQuery() void glGetQueryObject( id, GL_NUM_SAMPLES_PASSED, int* ) Retorna número de pixels que seriam gerados Draw() passa pelo pipeline convencional

29 Occlusion Queries Paradoxo Precisamos desenhar para saber oclusão
Mas queremos saber oclusão para saber se vamos desenhar

30 Occlusion Queries Paradoxo Solução
Precisamos desenhar para saber oclusão Mas queremos saber oclusão para saber se vamos desenhar Solução Desenhar volume envolvente!

31 Occlusion Queries Paradoxo Solução
Precisamos desenhar para saber oclusão Mas queremos saber oclusão para saber se vamos desenhar Solução Desenhar volume envolvente! Mas e a imagem final?

32 Occlusion Queries Paradoxo Solução
Precisamos desenhar para saber oclusão Mas queremos saber oclusão para saber se vamos desenhar Solução Desenhar volume envolvente! Mas e a imagem final? “Fingir” que vai desenhar! Desligar escrita no framebuffer: glColorMask( false )

33 Considerações Se vamos desenhar volumes envolventes
Deve ter baixo custo para desenhar Usar caixas: 8 vértices, triângulos Não usar esferas ou volumes mais complexos Ajuste do volume é importante! Usar AABB ou OBB? Ajuste ruim → falsos positivos Renderização de frente-para-trás Potenciais oclusores primeiro Fila de prioridade Occlusion query tem overhead? Problema crítico Sincronização CPU e GPU

34 Sincronização CPU ↔ GPU
CPU Stalls e GPU Starvation Ocupar CPU e GPU!

35 Descarte coerente hierárquico
Algoritmo hierárquico Percurso de frente-para-trás Análogo ao descarte contra volume de visão Caso volume seja descartado Descartar subárvore do nó correspondente Continuar em um irmão ou ancestral Desafios Gerenciar envio de occlusion queries Obter somente os resultados já disponíveis Minimizar stalls e starvation

36 Descarte coerente hierárquico
Coerência temporal Assume movimentos suaves do observador Nós previamente visíveis continuam visíveis Não esperar resultados de visibilidade Já renderizar assumindo coerência temporal Adiar classificação de um nó interno Marcar como invisível por default Atualizar de acordo com visibilidade dos filhos Pull-up visibility

37 Descarte coerente hierárquico
Para cada nó visitado Interno previamente visível Visitar sub-árvores Marcar como invisível por default Interno ou Folha previamente invisível Enviar query para volume envolvente Armazenar teste em uma fila Continuar caminhamento em irmão ou ancestral Folha previamente visível Renderizar geometrias enviando uma occlusion query

38 Descarte coerente hierárquico

39 Descarte coerente hierárquico
Como obter resultados evitando CPU stalls e GPU starvation?

40 Simples! Enquanto caminha na hierarquia Intercalar
Obter resultados conforme tornam-se disponíveis Se resultado for “visível” Pull-up visibility Renderizar geometrias (folha) Visitar sub-árvores (nó interno) Intercalar Visita de um nó da hierarquia Obtenção de resultados já disponíveis

41 Algoritmo enquanto não terminou caminhamento ou existem queries pendentes enquanto existem queries com resultado disponível, ou se caminhamento já acabou obter resultado da occlusion query do início da fila (mais antiga) se visivel pull-up visibility, renderizar geometrias e adicionar filhos à fila de prioridade se já terminou caminhamento, continue. Senão, obter próximo nó a ser visitado se nó está totalmente fora do volume de visão, continue se nó intercepta o plano near senão se nó era previamente visível se nó é interno adicionar filhos à fila de prioridade senão renderizar geometrias efetuando uma occlusion query efetuar occlusion query para volume envolvente

42 Possíveis melhorias Caminhamento terminou Renderizar especulativamente
E ainda existem occlusion queries pendentes CPU Stalls! Renderizar especulativamente Adiar atualização de visibilidade

43 Possíveis melhorias Muitas occlusion queries por quadro
Mesmo com hierarquia Depende da cena e divisão espacial Estimar visibilidade Nós continuam de fato visíveis no quadro atual? Sim! Propostas Queries somente de tempos em tempos Histórico de visibilidade de cada nó Probabilidade Movimento da câmera Outras

44 Resultados

45 Configuração de Testes
Windows XP Professional Microsoft Visual Studio NET Athlon XP (2.4 Ghz) 2 Gb RAM DDR2 800 MHz NVIDIA GeForce 7800 GT 256 Mb (PCI-E)

46 Cenas de Teste Teapots(n,s) 1.364 vértices 2.781 índices

47 Cenas de Teste P-38 objetos vértices

48 Testes Volumes envolventes AABB ~ OBB Clássica
Melhor custo x benefício OBB Aproximada Mínima

49 Testes AABB Clássica Aprox. Mín. Melhor AABB Clássica Aprox. Mín.

50 Testes Fecho (OBB-Tree) Fecho (Centróides) Fecho (Área)

51 Testes Occlusion Queries
tTesteDisp: Apenas um teste de disponibilidade Desprezível tDisp: Tempo para resultado disponível Proporcional à complexidade geométrica tDispObt: Resultado disponível + obtenção Obter resultado é desprezível

52 Testes Occlusion Queries Tempo para disponibilidade de resultado
Linearmente proporcional à complexidade geométrica

53 Testes Occlusion Queries
tRender: Renderização sem teste de visibilidade tUmaQuery: Apenas um teste de visibilidade Sem overhead tVariasQueries: Um teste para cada geometria Quanto mais testes, maior o custo de cada um

54 Testes Occlusion Queries Limiar em torno de 500 queries por quadro

55 Performance de Visualização
Caminho automático percorrido pelo observador Variando número de objetos visíves Base de comparação Renderização simples, sem otimizações Avaliar Impacto de diferentes hierarquias Algoritmo de descarte contra volume de visão Algoritmo de descarte por oclusão AABB, OBB Clássica e Aproximada Mínima

56 Teapots(500,30) Pouca complexidade geométrica Muita oclusão
“Cenas que já possuem bom desempenho”

57 Teapots(500,30) Descarte contra volume de visão: 5%
Descarte por oclusão: 40% Aprox. Mín não vale a pena, 100x mais lento para construir

58 Teapots(5000,3) Elevada complexidade geométrica Pouca oclusão
“Medir overhead dos testes de visibilidade”

59 Teapots(5000,3) Descarte contra volume de visão: 8%
Descarte por oclusão: 12%

60 Teapots(5000,20) Elevada complexidade geométrica Muita oclusão
“Melhor cenário para descarte por oclusão”

61 Teapots(5000,20) Descarte contra volume de visão: 6%
Descarte por oclusão: 81% (5x fps)

62 P-38 Elevada complexidade geométrica Muitas geometrias pouco complexas
Distribuição irregular no espaço “Caso de uso real”

63 P-38 Descarte contra volume de visão: 5% Descarte por oclusão: 57%

64 Conclusões Hierarquia essencial para escalabilidade
Descarte contra volume de visão Otimização fundamental, mas não suficiente Descarte por oclusão Traz melhorias mesmo com pouca oclusão Dificilmente se torna overhead Mesmo assim, perda de desempenho é mínima Extremamente eficiente Ganhos de até 6x na média de quadros por segundo Cerca de 2x no caso real de uso Bom-ajuste dos volumes não é essencial AABB é suficiente

65 Próximas aulas Waldemar estará de volta Mais adiante OpenSceneGraph
Traçado de raios


Carregar ppt "Descarte por visibilidade"

Apresentações semelhantes


Anúncios Google