2008-10-25 18 views
35

Soy interesante para aprender sobre las diferentes capas de abstracción disponibles para hacer aplicaciones gráficas.Aprendiendo acerca de la programación de gráficos de bajo nivel

Veo muchos términos: en el más alto nivel de abstracción, escucho cosas como C#, .NET, pyglet y pygame. Más abajo, escuché sobre DirectX y OpenGL. Luego están DirectDraw, SDL, la API de Win32 y otras bibliotecas multiplataforma como WxWidgets.

¿Cómo puedo obtener una buena idea de dónde termina una de estas capas y dónde comienza la siguiente? ¿Cuál es el modo de "nivel más bajo posible" para crear una ventana en Windows, en C? ¿Qué hay de C++? (Una muestra de código sería divina.) ¿Qué tal en X11? ¿Las implementaciones de Windows de OpenGL y DirectX están construidas sobre la API de Win32? ¿Dónde puedo comenzar a aprender sobre estas cosas?

Hay otra pregunta en SO donde se sugiere Programming Windows. ¿Qué tal para Linux? ¿Hay un libro equivalente?

Soy consciente de que esto es de muy bajo nivel, y de que hay muchas herramientas más amigables disponibles, pero al menos me gustaría aprender los conceptos básicos de lo que sucede debajo de la superficie. Por mucho que me gustaría comenzar a lanzar ventanas y vectores desde el comienzo, comenzar con algo como pygame es demasiado alto para mí; Realmente necesito hacer el circuito conceptual completo de cómo dibujar cosas en una computadora.

Definitivamente apreciaré las sugerencias de libros y recursos, pero creo que sería estupendamente genial si las respuestas a esta pregunta llenaran muchas maneras de llegar al "Hola mundo" con diferentes enfoques de programación de gráficos. ¿DO? C++? ¿Usando OpenGL? ¿Usando DirectX? En Windows XP? En Ubuntu? Tal vez pido demasiado.

+4

"¿Qué pasa con Linux? ¿Hay un libro equivalente equivalente?" - Ahora hay uno - http://www.amazon.com/The-Linux-Programming-Interface-Handbook/dp/1593272200 - muy rara vez un libro tiene una calificación de 100% de 5 estrellas, y 39 es razonablemente bueno tamaño de la muestra. –

+0

Max, tengo la misma pregunta, solo quiero saber si has encontrado tu camino a través de todas tus preguntas, porque estas mismas preguntas también me molestan –

+0

@SurajJain, no es mucho, pero hay un par de preguntas más que tengo Preguntó que también podría comenzar: http://stackoverflow.com/questions/235151/game-programming-how-to-avoid-reinventing-the-wheel http://stackoverflow.com/questions/12850071/what-is-the-simplest-way-to-render-a-3d-cube-with-one-lighting-source –

Respuesta

21

Michael Abrash's Graphics Programming 'Black Book' es un gran lugar para comenzar. ¡Además puedes descargarlo gratis!

+2

este es un enlace roto – Prabu

+1

Disponible en http://www.drdobbs.com/high -performance-computing/184404919 (por el momento :)). –

+1

Gracias, he actualizado el enlace. –

2

De entrada, yo diría "usted está pidiendo demasiado". Por la poca experiencia que he tenido, recomendaría leer algunos tutoriales u obtener un libro en DirectX u OpenGL para comenzar. Ir más allá de eso sería bastante complejo. La mayoría de los libros que he visto en OGL o DX tienen presentaciones bastante buenas que explican lo que hacen las funciones/clases.

Una vez que conozca uno de estos, siempre puede buscar en las bibliotecas para ver qué es exactamente lo que están haciendo para ir más abajo.

O, si realmente, DEBE aprender el nivel MÁS BAJO ... lea el libro en la publicación anterior.

4

Si realmente desea comenzar desde abajo, dibujar una línea es la operación más básica. Los gráficos por computadora simplemente se trata de rellenar píxeles en una cuadrícula (pantalla), por lo que debe calcular qué píxeles completar para obtener una línea que va desde (x0, y0) a (x1, y1).

Consulte Bresenham's algorithm para tener una idea de lo que está involucrado.

+3

Si se dibuja una línea llenando píxeles en una cuadrícula, ¿cómo puede ser más básico dibujar una línea que ... establecer un píxel? :) – unwind

2

libX11 es la biblioteca de nivel más bajo para X11. Creo que el opengl/directx habla directamente con el controlador/hardware (o emula operaciones no admitidas), por lo que sería la biblioteca de nivel más bajo.

Si desea comenzar con la programación de bajo nivel muy, busque el código de ensamblaje x86 para VGA y abra una copia de dosbox o similar.

3

Para ser un buen programador de gráficos y procesamiento de imágenes no se requiere este bajo nivel de conocimiento, pero no me gusta no tener ni idea de lo que estoy usando. Veo dos formas de perseguir esto: nivel alto hacia abajo o nivel inferior hacia arriba.

Top-down es una cuestión de seguir cómo se traza la acción desde una operación de gráficos de alto nivel, como dibujar un círculo, hasta el hardware. Conozca bien OpenGL. Luego, la fuente de Mesa (¡gratis!) Proporciona una ojeada sobre cómo se puede implementar OpenGL en el software. La fuente de Xorg sería la siguiente, primero para ver cómo va la acción desde las llamadas de API a través del lado del cliente hasta el servidor X. Finalmente te sumerges en un controlador de dispositivo que se conecta con el hardware.

De abajo hacia arriba: construye tu propio hardware de gráficos. Piense en formas en que podría conectarse a una computadora: cómo manejar números masivos de píxeles a través de unos pocos registros de tamaño de bytes, cómo funcionaría DMA. Escriba un controlador de dispositivo e intente diseñar una biblioteca de gráficos que pueda ser útil para los programadores de aplicaciones.

La forma de abajo hacia arriba es cómo aprendí, hace años cuando era una posibilidad con los microprocesadores lentos de 8 bits. La experiencia directa con la interconexión de circuitos y hardware-software me dio una buena apreciación de las difíciles decisiones de diseño, por ej. para pintar rectángulos usando hardware inteligente, en el controlador del dispositivo o en un nivel superior. Nada de esto tiene un valor práctico diario, pero proporciona una base de conocimiento para comprender la tecnología más nueva.

+0

Señor, tengo una pregunta que quería pedir tanto tiempo, hace c sin incluir ninguna biblioteca gráfica tener una función que podría hacerme algo así como un círculo, o algo más básico, manipular un píxel, no importa cómo Cuánto dura el código? –

3

En MSWindows es fácil: lo utiliza el API proporciona, si se trata de las ventanas estándar API de programación o de la API DirectX familiar: eso es lo que se utiliza, y ellos están bien documentados.

En un entorno de Windows X, utilice X11-libraries que se proporcionan. Si quieres entender los principios detrás de la ventana de X, te sugiero que hagas esto, sin importar que muchos otros te digan que no lo hagas, realmente te ayudará a entender los gráficos y las ventanas bajo X. Puedes leer la documentación de la programación X. (google para él). (¡Después de este ejercicio apreciaría las bibliotecas de nivel superior!)

Además de lo anterior, en el nivel absolutamente más bajo (excluyendo el nivel de chip) que puede ir es llamar a las interrupciones que cambian a los diversos modos gráficos disponibles - hay varios - y luego escribe en los búferes de la pantalla, pero para esto deberías usar el ensamblador, cualquier otra cosa sería demasiado lento. Seguir así no será portátil en absoluto.

Otra publicación menciona Abrash's Black Book - un excelente recurso.

Editar: En cuanto a los libros sobre programación Linux: es una cosa de comunidad, hay muchos howto alrededor; También encuentre un foro, únase a él, y mientras actúe civilizado obtendrá toda la ayuda que pueda necesitar.

36

El nivel más bajo sería la RAM de video de la tarjeta gráfica. Cuando la computadora se inicia por primera vez, la tarjeta gráfica generalmente se configura en el modo heredado de 80x25 caracteres.

Puede escribir texto con una interrupción proporcionada por BIOS en este momento. También puede cambiar el color de fondo y de fondo de una paleta de 16 colores distintivos. Puede usar puertos/registros de acceso para cambiar el modo de visualización.En este punto, podría decir, cargue una fuente diferente en la memoria de la pantalla y siga utilizando el modo 80x25 (las instalaciones del sistema operativo generalmente lo hacen) o puede continuar y habilitar VGA/SVGA. Es bastante complicado, para eso están los controladores.

Una vez que la tarjeta está en el modo "superior", cambiaría lo que está en la pantalla accediendo a la memoria asignada a la tarjeta de video. Se almacena horizontalmente píxel por píxel con algunas "regiones sucias" de píxeles que no están mapeadas en la pantalla al final de cada línea que debe compensar. Pero sí, puedes copiar los píxeles de una imagen en la memoria directamente a la pantalla.

Para cosas como DirectX, OpenGL. en lugar de escribir directamente en la pantalla, los comandos se envían a la tarjeta gráfica y actualiza su pantalla automáticamente. Comandos como "Hola, dibuja esta imagen que he cargado en la VRAM aquí, aquí y aquí" o "Dibuja estos triángulos con esta matriz de transformación ..." toma una fracción del tiempo en comparación con píxel por píxel. La CPU te lo agradecerá.

DirectX/OpenGL es una biblioteca amigable con los programadores para enviar esos comandos a la tarjeta con todas las funciones de apoyo para ayudarlo a realizarla sin problemas. Un enfoque más directo solo sería improductivo.

SDL es una capa de abstracción, así que sin molestarse en leerla supongo que tendría diferentes formas de trabajar en cada sistema. En uno podría usar escritura de pantalla semidirecta, otro Direct3D, etc. Lo que sea más rápido, siempre y cuando el código permanezca multiplataforma.

El sistema GDI/GDI + y XWindow. Están diseñados específicamente para dibujar ventanas. Originalmente dibujaban utilizando el método píxel por píxel (que era lo suficientemente bueno porque solo tenían que volver a dibujar cuando se presionó un botón o se movía una ventana, etc.) pero ahora usan Direct3D/OpenGL para el dibujo acelerado (y especial efectos). Las optimizaciones dependen de las versiones y las implementaciones de estas bibliotecas.

Así que si quieres la mayor potencia y velocidad, DirectX/openGL es el camino a seguir. SDL es ciertamente útil para obtener el máximo provecho de un entorno multiplataforma y se integra con OpenGL de todos modos. El sistema de ventanas es el último, pero no lo subestimes. Especialmente con las cosas que Microsoft tiene últimamente.

+1

Heh, heh, Na, ¡el nivel más bajo es el diseño VHDL o Verilog de un controlador VGA! De hecho, mira esto http://neil.franklin.ch/Projects/SoftVGA/ ¡Eso es solo usar un microcontrolador! – NoMoreZealots

Cuestiones relacionadas