perro paso para kawaii faciles facil dibujos dibujar dibuja cómo como c++ performance opengl 3d

c++ - paso - dibujos kawaii



¿Cómo puedo dibujar eficientemente miles de vértices? (3)

Actualmente estoy escribiendo un simulador interactivo que muestra la evolución de un sistema de partículas. Estoy desarrollando en Windows 7 de 32 bits, usando Visual Studio.

Actualmente, tengo una función para dibujar todas las partículas en la pantalla que se ve así:

void Simulator::draw() { glColor4f(255, 255, 255, 0); glBegin(); for (size_t i = 0; i < numParticles; i++) glVertex3dv(p[i].pos); glEnd(); }

Esto funciona muy bien y todo para probar, pero es absurdamente lento. Si tengo 200 partículas en la pantalla, sin hacer ningún otro cálculo (simplemente llamando repetidamente a draw ()), obtengo unos 60 fps. Pero si uso 1000 partículas, esto funciona a solo alrededor de 15 - 20 fps.

Mi pregunta es: ¿cómo puedo dibujar las partículas más rápidamente? Mi simulación funciona a una velocidad bastante aceptable, y en cierto punto, en realidad está siendo retenida (!) Por el dibujo.


En primer lugar, si no lo ha hecho, deshabilite el administrador de ventanas del escritorio; puede hacer una gran diferencia en la velocidad (básicamente está obteniendo en gran parte renderizado de software con el encendido).

En segundo lugar, aunque dudo que lo necesites, puedes cambiar al uso de glDrawArrays o glDrawElements (solo para un par entre muchas posibilidades).


La primera optimización que debe hacer es soltar glBegin / glEnd (modo inmediato) y pasar a matrices vértice (VA) y objetos de búfer vértice (VBO).

También es posible que desee buscar Sprites Point para dibujar las partículas.


esto será impopular, sé que lo odio:

use Direct X en su lugar.

Microsoft ha estado intentando matar a openGL desde Vista. así que es probable que te dificulten la vida.

entonces, si TODO ELSE falla, podrías intentar usar DirectX.

pero sí, lo que otros han dicho:

-use DrawArrays / Elements

-use vértices Buffers

-use punto de sprites

-Podrías crear un sombreado de vértices para que no tengas que actualizar todo el búfer de vértice en cada cuadro (simplemente guardas los ajustes iniciales como init pos, init velocity, init time, luego constante gravedad, luego el shader puede calcular la posición actual cada uno marco basado en una única constante global actualizada ''hora actual'')

-si es una configuración en Open GL (como en DirectX), asegúrese de estar utilizando Hardware Vertex Processing)