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 glDrawArrays
com 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 .