¿La forma más rápida de dibujar pequeñas partículas en opengl?

8

Pregunta rápida: ¿Cuál es el método más rápido para renderizar una gran variedad de partículas 4x4 / 8x8 en opengl? Actualmente paso 2 triángulos para cada uno, pero creo que es lento, así que realmente me gustaría saber si lo estoy haciendo bien .....

usuario1010005
fuente
1
Solo un recordatorio de que, dado que esta es una pregunta de rendimiento, debe medir el rendimiento en su plataforma de destino, (a) para asegurarse de que sea realmente lo suficientemente costoso como para que valga la pena preocuparse y (b) para probar la aceleración de cualquier solución propuesta.
Nathan Reed

Respuestas:

6

Puedes dibujar puntos con OpenGL.

Desea llamar a glDrawArrays () o glDrawElements () con GL_POINTS (en lugar de GL_TRIANGLE_STRIP o lo que esté utilizando).

Esto atraerá puntos a la pantalla en función del tamaño de punto actual, que puede establecer mediante glPointSize () . También puede alias estos puntos, pero en mi experiencia no todos los controladores / hardware admiten puntos con alias.

No puedes texturizar estos puntos; son solo un solo color.

notlesh
fuente
Gracias por la pista. ¿Sabes si podría hacer el Método GL_POINT con sombreadores para poder asignarles también una textura?
user1010005
1
Puede usarlo con sombreadores, pero solo hay un vértice para un punto (en el centro), por lo que puede tener dificultades para encontrar las coordenadas de texto. stackoverflow.com/questions/5839095/... parece que habla un poco sobre esto ...
notlesh
También puede establecer un sprite de punto con GL_POINTS.
Mick
1
@ user1010005 Para el mapa de texturas con GL_POINTS, puede mirar GL_POINT_SPRITE_ARB. Además, estoy bastante seguro de que los puntos siempre terminan ocupando el mismo número de píxeles en la pantalla, sin importar qué tan cerca o lejos estés de ellos.
kevintodisco
@ktodisco, puede pasar el tamaño en puntos como un atributo. Logré un efecto de estrella decente haciendo esto. para cambiar el tamaño en el sombreador vertical, asigne la variable gl_PointSize
notlesh
3

En el núcleo OpenGL 3.2 y superior, los sombreadores de geometría están disponibles para su uso. Para dar una breve descripción, solo le diría a OpenGL que dibuje los puntos que representan las posiciones de sus partículas, y estos puntos pasarían a través del sombreador de vértices normalmente, pero luego cuando llegan al sombreador de geometría, construye el rectángulo (fuera de dos tris) emitiendo vértices a la siguiente etapa de la tubería. Junto con los vértices, puede generar mediante programación coordenadas normales y coordenadas de textura.

Como todo esto se hace en hardware, estoy bastante seguro de que es la forma más rápida en este momento para representar partículas de sprites puntuales.

kevintodisco
fuente
1
Probablemente sea una solución mejor que GL_POINTS, pero no funcionará para implementaciones antiguas de OpenGL (y OpenGL ES).
notlesh
Suena genial pero planeo portar mi juego a la plataforma Android :(
user1010005
2
@ user1010005 Solo un consejo, debe mencionar que cuando hace la pregunta, para que sepamos con qué restricciones trabajar :)
kevintodisco
Soy un principiante con opengl lo siento D:
user1010005
Me ENCANTARÍA ver el sombreador de geometría disponible en OpenGL ES. ) =
notlesh