2010-07-12 19 views
5

Utilicé DirectDraw en C y C++ años atrás para dibujar algunos gráficos 2D simples. Estaba acostumbrado a los pasos de crear una superficie, escribir en ella usando punteros, voltear el buffer de respaldo, almacenar sprites en superficies fuera de pantalla, y más. Entonces, si hoy quiero escribir algunos programas de gráficos 2D en C o C++, ¿cuál es el camino a seguir?Programación simple de gráficos en 2D

  1. ¿Se aplicará este mismo método de programación o tengo que tener una comprensión diferente de la abstracción del hardware de video?
  2. ¿Qué bibliotecas y herramientas están disponibles en Windows y Linux?
+1

OpenGL es la respuesta inmediata más obvia. Es potente con una curva de aprendizaje baja para aplicaciones simples. – Akusete

Respuesta

3

¿Qué bibliotecas y herramientas están disponibles en Windows y Linux?

SDL, OpenGL y Qt 4 (es biblioteca de interfaz gráfica de usuario, pero es lo suficientemente rápido/flexible para la representación 2D)

Será este mismo método de programación siguen siendo válidas o tengo que tener una diferente comprensión de la abstracción de hardware de video?

Normalmente no se escriben datos en la superficie "usando punteros" en cada cuadro, sino que se manipulan/dibujan utilizando los métodos proporcionados por la API. Esto se debe a que el controlador funcionará más rápido con la memoria de video que si transfiere datos de la memoria del sistema a la memoria de video en cada cuadro. Todavía puede escribir datos en la superficie/textura del hardware (incluso durante cada cuadro), si es necesario, pero esas superficies pueden necesitar un tratamiento especial para obtener un rendimiento óptimo. Por ejemplo, en DirectX necesitaría decirle al controlador que los datos de superficie van a cambiar con frecuencia y que solo va a escribir datos en la superficie y nunca volverá a leerlos. Además, en las API orientadas a 3D (OpenGL/DirectX), la superficie de representación en la otra superficie es un caso "especial", y es posible que necesite utilizar "Renderizar destinos" (DirectX) o "Objetos de framebuffer" (OpenGL). Lo cual es diferente de DirectDraw (donde, AFAIK, puedes cambiar cualquier cosa por algo). Lo bueno es que con 3D api obtienes una forma increíblemente flexible de manejar las superficies/texturas (estirarlas, rotarlas, teñirlas de color, mezclarlas, procesarlas usando sombreadores) en el hardware.

Otra cosa es que las aplicaciones 3D modernas con soporte de hardware con frecuencia no funcionan en texturas de 8 bits en palés, y prefieren imágenes ARGB. Las superficies de 8 bits con paleta se pueden emular, cuando sea necesario, y las apis 2D de nivel bajo (SDL, DirectDraw) las proporcionan. También puede emular texturas de 8 bits en hardware utilizando sombreadores de fragmentos/píxeles.

De todos modos, si quiere una forma de uso de superficies "cruzada" de la vieja escuela (es decir, "escriba datos en cada cuadro mediante punteros", es decir, necesita un procesador de software o algo), SDL lo permite fácilmente. Si desea operaciones de mayor nivel y más flexibles, Qt 4 y OpenGL son para usted.

2

En Linux puede usar OpenGL, no solo se usa para soporte 3D sino que también es compatible con 2D.

1

SDL es también bastante fácil de usar, listo para usar. También es multiplataforma e incluye (y tiene muchos) complementos disponibles para manejar sus necesidades. También se conecta muy bien con OpenGL si necesita soporte 3D.

Cuestiones relacionadas