Otimizando a renderização Octree

7

Digamos que eu tenha uma octree e, em um certo nível, eu armazene VBOs nessa octree. Conheço as dimensões dos nós que possuem o vbo para que eu possa fazer a seleção básica do frustum. Isso funciona muito bem porque tudo fora da tela nunca é renderizado.

No entanto, meu mundo é muito grande e atualmente também desenhei coisas por trás de outros lugares já desenhados. O que eu usaria para não desenhar nós ocluídos por outros nós e como eu faria isso?

Eu vi algumas menções de seleção de oclusão no OpenGL soberbamente, mas não consigo entender como posso utilizá-lo quando não tenho uma distinção clara entre oclusores e oclusos.

Armin Ronacher
fonte
11
Se o conteúdo de um nó não necessariamente preencher completamente um nó então eu não posso ver como você poderia usar seu octree para oclusão
CiscoIPPhone
Você pode usar o conteúdo do octree como oclusor e os nós octree como oclusores. A cobertura agregada de pixels de vários nós parcialmente preenchidos (ou seja, parcial, porque não é mapeado para a área total de pixels do cubo do nó octree) pode formar facilmente um oclusor grande, e isso pode bloquear os nós octree que estão mais distantes do Câmera.
Crowley9

Respostas:

6

Um dos recursos do octree é que ele permite que você processe seus nós octree na ordem inversa ou anterior. Fazer isso ajudará muito o desempenho, pois permite que a implementação do EarlyZ do hardware gráfico seja mais eficaz (você executa menos shaders, executa menos trabalhos de varredura etc.)

O benefício de usar consultas de oclusão para consultar a visibilidade dos nós octree é que ele pode evitar que você renderize objetos geométricos altamente complexos ocluídos. Os objetos (opacos) em sua cena são seus oclusores e seus nós de octree (e, implicitamente, o conteúdo deles) são ocluídos. Como Samaursa disse, é realmente difícil fazer isso direito, portanto, verifique este documento antes de tentar (as barracas prejudicarão o desempenho se não forem tratadas com cuidado). Além disso, verifique se a complexidade geométrica é realmente o seu limitador de desempenho, caso contrário você provavelmente estará perdendo seu tempo.

Crowley9
fonte
2

O OpenGL nativamente não suporta consultas de oclusão, mas você pode usar extensões como ARB_occlusion_query . O link tem um projeto e um bom PDFque explica como usá-lo. Porém, tenha cuidado, às vezes as consultas de oclusão acabam custando mais do que simplesmente desenhar a geometria. Isto é especialmente verdade se a geometria não for muito complexa.

Se você fornecer mais informações sobre sua cena (captura de tela), uma solução melhor poderá ser fornecida.

Samaursa
fonte
0

Atualmente, fui apenas encomendar meus vbos por distância para a câmera. Isso parece ajudar mais. A menos que eu não consiga entender as consultas de oclusão, isso torna meu código lento e fornece resultados estranhos, em vez de realmente ajudar. Portanto, a menos que eu veja mais alguns problemas de desempenho ao longo do caminho, continuo com o que tenho.

Armin Ronacher
fonte
Boa ideia. :-) Você pode querer consultar consultas de oclusão predicadas (necessárias para o hardware DX10, e espero que exista uma extensão OGL). A situação pode ajudar a evitar paradas, removendo muitas desvantagens. Mais uma vez, a principal motivação aqui é se você estiver renderizando milhões de triângulos por quadro.
Crowley9