Existe alguma maneira de gerar primitivas em um sombreador de geometria sem nenhuma geometria de entrada?


17

Alguns anos atrás, tentei implementar essa GPU Gem no OpenGL para gerar terreno procedural 3D usando Marching Cubes . O artigo sugere implementar cubos de marcha em um sombreador de geometria para obter a máxima eficiência. Isso significa que eu preciso executar o shader uma vez para cada voxel no domínio e ele gerará toda a geometria nessa célula.

Um problema que encontrei foi como colocar o sombreador de geometria funcionando sem ter realmente nada para renderizar fora desse sombreador. Minha solução (que parecia bastante hacky) foi renderizar um ponto em cada célula, descartá-lo com o sombreador de geometria e emitir meus triângulos. Eu nunca encontrei uma solução adequada e essa solução alternativa permaneceu no código final.

Então, existe uma maneira de dizer ao OpenGL para iniciar uma passagem de renderização a partir do shader de geometria sem nenhuma geometria de entrada? Ou sempre terei que enviar alguns pontos fictícios à GPU para que as coisas funcionem.

Respostas:


15

Não, não existe realmente uma maneira de fazer isso.

Uma chamada de sombreador de geometria requer uma primitiva de entrada e gera 0 ou mais primitivas de saída. Sem uma primitiva de entrada, não há realmente uma maneira de realmente chamar o sombreador de geometria . É claro que você pode estender os limites do número máximo de primitivas de saída do sombreador de geometria para cada primitiva de entrada (não conheça os limites práticos no momento, deve estar na ordem de milhares, talvez). Então você pode gerar 1024 triângulos para cada ponto, mas sempre precisa ter algumas primitivas de entrada.

O que você não precisa, no entanto, é uma noção real de geometria. Você realmente não precisa renderizar pontos 3D em qualquer local razoável, eles também podem ter apenas algumas coordenadas abstratas de índice ou textura ou qualquer outra coisa como atributos e não necessariamente uma posição 3D significativa. Ninguém dita quais atributos seus vértices possuem. E você pode até renderizar vértices sem nenhum atributo . Mas você precisa renderizar algumas primitivas para invocar o sombreador de geometria, mesmo que essas primitivas não possuam atributos reais (como você calcula sua geometria de saída no sombreador de geometria é uma questão diferente).

Mas o que você realmente fez, renderizando um ponto para cada célula da grade e gerando os triângulos dos cubos de marcha para essa célula a partir dela, é exatamente a abordagem direta. É claro que os atributos que essa célula contém depende de você; pode ser uma posição 3D, um cabo de texto em uma textura 3D, o que for, mas essas são as células da grade que você renderiza. Puramente semântico, você não "descarta" esses pontos e depois os "substitui" por triângulos, mas "converte" cada ponto em um conjunto de triângulos. É exatamente para isso que serve o shader de geometria e não há nada de "hacky" ou "impróprio" nele. Ninguém diz que o sombreador de geometria precisa gerar o mesmo tipo primitivo de saída que foi inserido para ser "adequado" .


O que você pode fazer para obter uma maneira amplamente sem entrada de renderizar sua grade de voxel (e isso pode ser o que você estava realmente pedindo) seria apenas desenhar um conjunto de pontos sem atributos. Isso significa que você não precisa de nenhuma matriz de atributos e apenas desativa todas elas e invoca uma simples glDrawArrayscom o número de células que você precisa. Em seguida, no sombreador de vértices ou no sombreador de geometria, você pode gerar o índice de célula de grade 3D necessário com um pouco de magia de índice a partir do ID do vértice de entrada (ou seja gl_VertexID, que é a única informação que você possui) e depois calcular a geometria dos cubos de marchas a partir de uma pesquisa em a textura do volume 3D (ou qualquer estrutura de dados).

Portanto, em retrospecto, devo relativizar minha declaração desde o início: você não pode gerar primitivas sem nenhuma primitiva de entrada , mas pode gerá-las sem nenhuma geometria de entrada .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.