graphics - studio - superponer graficas en r ggplot
Aprendiendo acerca de la programación de gráficos de bajo nivel (8)
Soy interesante para aprender sobre las diferentes capas de abstracción disponibles para hacer aplicaciones gráficas.
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 tener 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 sobre SO en donde se sugiere programar 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 un circuito conceptual completo sobre 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 se llenaran con muchas maneras diferentes de llegar al "Hola mundo" con diferentes enfoques para la programación de gráficos. ¿DO? C ++? ¿Usando OpenGL? ¿Usando DirectX? En Windows XP? En Ubuntu? Tal vez pido demasiado.
Desde el principio, yo diría "estás 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 conozcas uno de estos, siempre podrías buscar en las bibliotecas para ver qué es exactamente lo que están haciendo para ir más abajo.
O, si realmente, DEBE aprender absolutamente el nivel MÁS BAJO ... lea el libro en la publicación anterior.
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 punto. 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 de forma horizontal píxel por píxel con algunas "regiones sucias" de píxeles que no se asignan a 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 soporte para ayudarlo a que se realice sin problemas. Un enfoque más directo solo sería improductivo.
SDL es una capa de abstracción, así que sin molestarme 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.
Entonces, si quiere 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.
En MSWindows es fácil: utiliza lo que proporciona la API, ya sea la API de programación de Windows estándar o la API de DirectX-family : eso es lo que usa, y están bien documentados.
En un entorno de Windows X, utiliza las bibliotecas X11 proporcionadas. 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ás 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 de gráficos disponibles (hay varios) y luego escribir en los búferes de la pantalla, pero para esto Tendría que usar ensamblador, cualquier otra cosa sería demasiado lento. Seguir así no será portátil en absoluto.
Otro post menciona el libro negro de Abrash, un excelente recurso.
Edit: en cuanto a los libros sobre programación de Linux: es algo 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.
Ser un buen programador de gráficos y procesamiento de imágenes no requiere este conocimiento de bajo nivel, pero odio no tener idea del interior de lo que estoy usando. Veo dos formas de perseguir esto: nivel alto hacia abajo o nivel inferior hacia arriba.
De arriba hacia abajo 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 ascendente es cómo aprendí, hace años, cuando era posible con los lentos microprocesadores 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 ejemplo, 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.
Si realmente quieres 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).
Mira el algoritmo de Bresenham para tener una idea de lo que está involucrado.
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 una programación de muy bajo nivel, busque el código de ensamblaje x86 para VGA y ejecute una copia de dosbox o similar.
vea la sección de Open GPU Documentation: http://developer.amd.com/documentation/guides/Pages/default.aspx
HTH
Programación de gráficos de Michael Abrash ''Black Book'' es un gran lugar para comenzar. ¡Además puedes descargarlo gratis!