En este artículo crearemos una paleta de colores para salida VGA bajo DOS. El código fuente del último artículo sobre VGA se expande para dibujar un fondo con degradados de color.
Tutorial de programación en DOS – Paleta de colores VGA
En el último artículo, mostramos todos los colores línea por línea y vimos que el resultado no es un degradado. Bajo DOS hay diferentes paletas de colores en las que se almacenan los colores. Se accede a ellos a través de un índice. Eso significa que el color en el índice 10 no siempre es el mismo. Puede definir usted mismo qué valor de color se encuentra allí. ¿Porqué es eso?
Almacenamiento limitado
La memoria de video es limitada, siempre lo es. Hoy, sin embargo, tenemos tarjetas gráficas de 8 gigas y más, donde podemos guardar y dibujar fácilmente todos los colores que podemos ver. En el ejemplo de cálculo mostré que no solo los colores sino también cada píxel de la imagen a dibujar debe almacenarse en la memoria. Por lo tanto, cuanto mayor sea la resolución, menos memoria quedará para los colores.
Agregar paleta de colores
Creamos nuestra propia paleta de colores para nuestro programa, porque queremos crear gradientes de color más hermosos. Creé 2 nuevas funciones para esto.
- crear una paleta de colores
- colocar una paleta de colores en la memoria de video
Para esto necesitamos algunas constantes:
#define NUM_COLORS 256 /* tamaño de la paleta de colores */ #define PALETTE_INDEX 0x3C8 /* número de puerto para VGA DAC PEL */ #define PALETTE_DATA 0x3C9 /* número de puerto para datos VGA DAC */
#define NUM_COLORS 256 /* tamaño de la paleta de colores */ #define PALETTE_INDEX 0x3C8 /* número de puerto para VGA DAC PEL */ #define PALETTE_DATA 0x3C9 /* número de puerto para datos VGA DAC */ |
Por ejemplo, la paleta de colores se crea así:
/* crea una paleta de colores para el color VGA y le devuelve un puntero */ byte* get_color_palette() { byte* pal; ent yo; amigo = (byte*)malloc(NUM_COLORS * 3); /* Colores RGB */ /* cielo */ for(i=0; i<100; ++i) { /* ¡Colores de 6 bits! */ amigo[i*3 + 0] = MIN(63, i/2); /* rojo */ amigo[i*3 + 1] = MIN(63, i/2); /* verde */ amigo[i*3 + 2] = 63; /* azul */ } /* suelo */ for(i=100; i<200; ++i) { amigo[i*3 + 0] = 15; /* rojo */ amigo[i*3 + 1] = ((i-100) / 2) +15; /* verde */ amigo[i*3 + 2] = 15; /* azul */ } return amigo; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis 17 18 19 20 21 22 23 | /* crea una paleta de colores para el color VGA y le devuelve un puntero */ byte* get_color_palette() { bytes* amigo; ent yo; amigo = (byte*)malloc(NUM_COLORS * 3); /* colores RGB */ /* cielo */ para(i=0; i<100; ++i) { /* ¡Colores de 6 bits! */ Camarada[i*3 + 0] = MIN(63, i/2); /* rojo */ Camarada[i*3 + 1] = MIN(63, i/2); /* verde */ Camarada[i*3 + 2] = 63; /* azul */ } /* suelo */ para(i=100; i<200; ++i) { Camarada[i*3 + 0] = 15; /* rojo */ Camarada[i*3 + 1] = ((i-100) / 2) +15; /* verde */ Camarada[i*3 + 2] = 15; /* azul */ } Vuelve amigo; } |
En el código, solo una matriz se llena con valores numéricos. El campo es número de colores * 3 de tamaño. 3 porque cada color consta de un componente rojo, verde y azul (colores RGB). Dado que nuestro código genera el color de un índice de la paleta por línea, creamos 200 (resolución de 320 × 200) colores diferentes.
/* copia la matriz de la paleta de colores a la dirección VGA DAC PEL */ void set_color_palette(byte* pal) { int i; /* outp escribe un byte en el puerto de hardware */ outp(PALETTE_INDEX, 0); for(i=0; i<NUM_COLORS * 3; ++i) { salida(PALETA_DATOS, amigo[i]); } }
/* copia la matriz de la paleta de colores a la dirección VGA DAC PEL */ void set_color_palette(byte* amigo) { ent yo; /* outp escribe un byte en el puerto de hardware */ salida(PALETA_INDEX, 0); para(i=0; i<NUM_COLORS * 3; ++i) { salida(PALETTE_DATA, amigo[i]); } } |
El campo de colores se copia a través de una nueva función outp del encabezado dos.h. Esta función utiliza nuevamente las funcionalidades de DOS para llenar la memoria de video a través del sistema operativo. DOS ofrece una gran cantidad de puertos de hardware que se pueden utilizar para acceder al hardware. En la sección VGA encontrarás:
3C8 Vídeo VGA DAC Dirección PEL 3C9 Vídeo VGA DAC
Dirección PEL del DAC de vídeo VGA 3C8 DAC de vídeo VGA 3C9 |
El resultado se ve así:
Conclusión
Como puede ver, debe pensar en lo que desea dibujar antes de escribir la primera línea del código del programa. Luego, crea una lista de todos los colores requeridos y luego intenta almacenarlos en la memoria de video limitada en una paleta de colores. Después de eso, se puede dibujar la imagen especificando los índices de los colores por píxel. Este proceso hace que dibujar píxeles sea un poco más complicado de lo esperado. Como suele suceder, no mejora debido a las limitaciones del hardware.
(Visita 234 veces, 1 visitas hoy)