www.delorie.com/djgpp/doc/ug/graphics/intro.html   search  

 

Guía: Informaciones básicas sobre gráficos

Para poder elaborar un programa que visualiza imágenes gráficas, debes configurar el hardware de vídeo con una de las diferentes resoluciones gráficas disponibles. En esos modos, la imagen de la pantalla se crea tomando como base una rejilla de diminutos puntos llamados píxeles, siendo posible asignar a cada uno de ellos un color distinto. Puedes construir contornos complejos combinando muchos de esos puntos hasta formar un patrón adecuado. Este proceso podría compararse con un pedazo de papel milimetrado, en el cual cada cuadrado puede colorearse de manera diferente. En los modos de vídeo de PC más comunes un píxel ocupa exactamente un byte de memoria, siendo por ello posible que asuma cualquiera de los 256 distintos colores posibles, pero las tarjetas gráficas modernas soportan resoluciones con más colores tales como, por ejemplo, los modos de alta resolución de color que utilizan píxeles de 16 bits (65536 colores diferentes), y los modos de color real con píxeles de 24 bits (hasta 16777216 colores posibles).

Existen muchas bibliotecas que pueden facilitar mucho la programación de gráficos con djgpp, tales como Allegro, GRX y Jlib, pero en este archivo no intentaremos describir su uso, ya que ese cometido se ha cumplido ya en la documentación de los paquetes respectivos. La presente documentación está dirigida a la gente que desea escribir su propio código gráfico "desde la base", sin utilizar ninguna biblioteca de terceros. No se requiere experiencia previa en la programación de gráficos de PC, pero sí algunos conocimientos del mapeo de memoria DPMI y nociones fundamentales de la forma de acceder a la memoria convencional (estos temas se tratan en el capítulo anterior (no escrito todavía)).

Una pantalla gráfica consta de una matriz de píxeles denominada "búfer de vídeo". De conformidad con las convenciones, un búfer de vídeo debe indexarse con el origen (cero) en la esquina superior izquierda, con el eje X aumentando hacia la derecha y el eje Y aumentando a medida que te desplazas hacia abajo en la pantalla. Esto coincide con la distribución de una matriz C, de manera que puedes declarar la matriz de tu pantalla como una matriz sencilla de dos dimensiones. Así, por ejemplo, en una resolución de 320x200 podrías escribir:

   unsigned char screen_image[200][320];

Ten presente que el valor Y debe preceder al valor X: esto puede parecer ilógico, pero es necesario para que la distribución de la memoria sea correcta.

Después de esta declaración puedes acceder a los píxeles en su respectiva ubicación (x,y) mediante una sintaxis de matriz C normal. Por ejemplo, para dibujar un píxel en el búfer de vídeo deberás escribir:

   screen_image[y][x] = color;

Esto parece muy sencillo, pero en muchas ocasiones resulta más adecuado tratar el búfer de vídeo como una matriz C de una sola dimensión y procesar el desplazamiento de píxeles uno mismo (esto resulta necesario cuando tu programa se ejecutará con más de una resolución posible, ya que al momento de compilar se desconocen el ancho de la pantalla y, por lo tanto, las dimensiones de la matriz). Para utilizar este sistema, debes reescribir la declaración del búfer de vídeo de la siguiente forma:

   unsigned char screen_image[320*200];

y dibujar un píxel con el código:

   screen_image[y*320+x] = color;

Hasta ahora, estos búferes de vídeo han sido solamente matrices normales en la memoria, de manera que sin importar lo que escribas en ellos, los resultados nunca se mostrarán en pantalla. Pero seguramente te alegrará saber que el hardware gráfico utiliza exactamente el mismo formato para guardar las imágenes que visualiza en tu pantalla, de forma que basta con copiar la figura de este búfer de vídeo de memoria al área de memoria especial utilizada por la tarjeta VGA para que la figura se visualice y todos puedan verla. Es muy complicado escribir directamente en la memoria de vídeo, ya que está ubicada fuera de tu espacio de direccionamiento normal. Por ello, se requieren técnicas especiales para acceder a ella y es por este motivo que mucha gente opta por preparar un marco entero de gráficos en un búfer de memoria (de la forma descrita arriba) y copiarlo luego a la memoria de vídeo una vez que la imagen entera esté completa, pero las reglas básicas son las mismas.

Traducido por: Winston Cevallos [www.cevallos.de] (21/6/2000)
Revisado por:

  Copyright © 1998   by DJ Delorie     Updated Jan 1998  
1