¿Hay alguna forma de generar primitivas en un sombreador de geometría sin ninguna geometría de entrada?


17

Hace unos años intenté implementar esta GPU Gem en OpenGL para generar terreno procesal en 3D usando Marching Cubes . El artículo sugiere implementar Marching Cubes en un sombreador de geometría para obtener la máxima eficiencia. Esto significa que necesito ejecutar el sombreador una vez para cada vóxel en el dominio, y generará toda la geometría en esa celda.

Un problema con el que me topé fue cómo hacer que el sombreador de geometría se ejecutara sin tener realmente nada que representar fuera de ese sombreador. Mi solución (que parecía bastante hacky) era representar un punto en cada celda, descartarlo con el sombreador de geometría y emitir mis triángulos en su lugar. Nunca encontré una solución adecuada y esta solución se mantuvo en el código final.

Entonces, ¿hay alguna forma de decirle a OpenGL que comience un paso de representación desde el sombreador de geometría sin ninguna geometría de entrada? O siempre tendré que enviar algunos puntos ficticios a la GPU para que todo funcione.

Respuestas:


15

No, no hay realmente una manera de hacerlo.

Una invocación de sombreador de geometría requiere una primitiva de entrada y genera 0 o más primitivas de salida. Sin una primitiva de entrada, no hay realmente una manera de invocar el sombreador de geometría . Por supuesto, puede estirar los límites del número máximo de primitivas de salida del sombreador de geometría para cada primitiva de entrada (no conozco los límites prácticos en este momento, tal vez deberían ser del orden de miles). Por lo tanto, podría generar 1024 triángulos para cada punto, pero siempre debe tener algunas primitivas de entrada.

Lo que no es necesario sin embargo, es una noción real de la geometría. Realmente no tiene que renderizar puntos 3D en ninguna ubicación razonable, también podrían tener solo un índice abstracto o coordenadas de textura o lo que sea como atributos y no necesariamente una posición 3D significativa. Nadie dicta qué atributos tienen tus vértices. E incluso puede renderizar vértices sin ningún atributo . Pero debe renderizar algunas primitivas para invocar el sombreador de geometría en ellas, incluso si esas primitivas no tienen ningún atributo real (sin embargo, cómo calcular su geometría de salida en el sombreador de geometría es una pregunta diferente).

Pero lo que realmente hizo, representar un punto para cada celda de la cuadrícula y generar los triángulos de cubos de marcha para esa celda a partir de ella, es exactamente el enfoque directo. Por supuesto, los atributos que contiene esta celda dependen de usted, podría ser una posición 3D, un texcoord en una textura 3D, lo que sea, pero esas son las celdas de la cuadrícula que renderiza. Hablando puramente semánticamente, en realidad no "descartas" esos puntos y luego los "reemplazas" por triángulos, sino que "conviertes" cada punto en un conjunto de triángulos. Para eso es exactamente el sombreador de geometría y no hay nada "hacky" o "incorrecto" al respecto. Nadie dice que el sombreador de geometría tiene que generar el mismo tipo primitivo de salida que la entrada para que sea "adecuado" .


Lo que puede hacer para lograr una forma en gran medida sin generar insumos de su cuadrícula de vóxel (y esto podría ser lo que realmente estaba pidiendo) sería dibujar un conjunto de puntos sin atributos. Esto significa que no necesita ninguna matriz de atributos, simplemente desactívelas e invoque un simple glDrawArrayscon el número de celdas que necesita. Luego, en el sombreador de vértices o el sombreador de geometría, puede generar el índice de celda de cuadrícula 3D necesario con un poco de magia de índice a partir de la ID de vértice de entrada (es decir gl_VertexID, que es la única información que tiene) y luego calcular la geometría de los cubos de marcha a partir de una búsqueda en la textura del volumen 3D (o cualquier estructura de datos).

Entonces, en retrospectiva, debo relacionar mi declaración desde el principio: no puede generar primitivas sin ninguna primitiva de entrada , pero puede generarlas sin ninguna geometría de entrada .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.