Programación
del acelerador gráfico Intel740.
Todos los juegos y programas
multimedia en general del momento hacen uso de las nuevas tarjetas
aceleradoras 2D/3D mediante el uso de las famosas librerías estándar
de Windows DirectX u OpenGL. Gracias a esta tecnología se
consiguen generar imágenes 2D/3D de alta calidad y con una
elevada tasa de refresco incluyendo toda clase de efectos tales como
transparencias, niebla, texturizados, antialiasings, etc.
El chip i740 está diseñado
para funcionar en sistemas AGP. Todas
estas placas 2D/3D aceleradoras son relativamente baratas y mucha
gente empieza a incorporarlas actualmente en sus equipos. Intel, ha
visto que este mercado ofrece cada vez más dividendos y
finalmente se ha decidido a crear el primer chip acelerador 2D/3D de
bajo coste denominado i740. Este
acelerador no ha sido creado con la intención de que sea un
competidor más entre los muchos que ya hay actualmente en el
mercado, sino que se ha diseñado con la idea de que se
convierta en un componente estándar. Es decir, el objetivo de
Intel consiste en la instalación de serie en las placas base de
nueva generación que aparezcan en el mercado en un futuro
inmediato, como respuesta al aumento de recursos que requieren la
mayoría de las aplicaciones estándar actuales.
Bus AGP. Como
era de esperar siendo una nueva tecnología gráfica, este
nuevo chip acelerador 2D/3D ha sido diseñado para ser instalado
en placas base basadas en la arquitectura de bus AGP (Accelerated
Graphics Port: Puerto de Gráficos Acelerado), diseñada
también por Intel para que los rápidos procesadores
Pentium II actuales puedan transmitir información gráfica
a gran velocidad por un bus exclusivo para ello. De esta forma, se
consiguen unos ratios de transferencia de datos de hasta 533 Mb/s,
junto con la liberación de los buses PCI estándar para
otras operaciones de datos.
Programar el Intel740. Este
nuevo chip, está diseñado para poder funcionar tanto con
las librerías estándar de Windows DirectX y OpenGL, por
lo que su compatibilidad con las aplicaciones gráficas más
modernas será inmediata.
Características técnicas
del chip. Para que el
lector pueda hacerse una idea de la potencia general de este chip y
para que pueda compararlo con otros de los que pueda obtener información,
se pueden dar algunos datos orientativos típicos de velocidad y
funcionalidad: 0.85 Megatriángulos por segundo, entre 425 y 500
K de triángulos por segundo con todas las características
3D activadas, entre 45 y 55 Megapixels por segundo con todas las
características activadas, uso del puerto doble AGP, ejecución
en paralelo, salida de vídeo programable, soporte para captura
de vídeo (16 o 8 bits), Reproducción de vídeo en
pantalla completa, soporte de Intercast y VBI, capacidad de uso de
MPEG II DVD. Por último decir que está optimizado para
funcionar con el chipset 440LX de Intel.
A continuación se van a
detallar todas las funciones 3D, 2D y otras que puede realizar el
chip:
Funciones 3D del chip. En
el apartado de las funciones 3D, que es el apartado que más
suelen apreciar todos los usuarios domésticos debido
principalmente a que los videojuegos más populares y que más
atractivo tienen son los simuladores 3D, se puede decir que el chip
posee todas las capacidades típicas de esta clase de chips. Se
trata de las siguientes:
Atributos de color en
superficie. Dentro del
apartado de efectos típicos que se suelen aplicar a los objetos
generados en escenas 3D, tenemos que el chip Intel740 soporta todos
los siguientes:
Efecto foggin. El
efecto foggin consiste en poder añadir el efecto de densidad a
la atmósfera de la imagen que estemos generando, dando la
sensación que los objetos se ven más nublados a mayor
distancia del observador.La fórmula
que usa internamente este algoritmo es la siguiente: { C= f * Cp + (1
- f) * Cf }, donde f es el color del polígono y Cf el color del
fog (niiebla).
Ejemplo con DirectX: Para
activar este efecto, solamente tenemos que poner la bandera
D3DRENDERSTATE_FOGENABLE a TRUE y después se debe especirficar
el color fog usando valores RGB. Por otro lado, la densidad del efecto
fog se debe indicar mediante el componente alpha del valor especular
de un vértice usando el tipo de dato pLVertex en D3DLVERTEX. Por
último sólo decir que este efecto puede regularse entre
los valores 0 y 255, siendo 0 el valor máximo aplicable
(densidad fog máxima) y 255 el mínimo (equivalente a
desactivado).
El código de todo lo dicho
quedaría de esta forma:
SetRenderState(D3DRENDER_STATE_FOGENABLE,
TRUE);
SetRenderState(D3DRENDER_STATE,
FOGCOLOR, <D3DCOLOR>);
D3DLVERTEX pLVertex;
pLVertex.specular = RGBA_MAKE(sred,
sgreen, sblue, FOG_DENSITY);
Ejemplo con OpenGl: El
código necesario para que las librerías OpenGL activen
el efecto anterior y para que usen la aceleración por hardware
con el chip Intel 740 se debe indicar como sigue:
glEnable(GL_GOF) {...};
glFogi(GL_FOG_MODE, GL_LINEAR);
GLfloatfogColor[4] = {0.5, 0.5, 0.5,
1.0};
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, <0.5>);
Como detalle decir que en OpenGL el
nivel de densidad se indica con un valor de coma flotante entre 0.0 y
1.0 y no con un valor byte entero.
Luz especular. Otro
de los efectos mas usados en la generación de imagen 3D y que
soporta el chip, es el uso de luces especulares (Specular
highlighting), pudiéndose incluso elegir el tipo (atributos) de
luz que hará el efecto.Posee
aceleración tanto 2D como 3D
Ejemplo con DirectX:
A continuación se muestran
unas líneas de código que atribuyen una luz especular
roja en un vértice y que activa este efecto:
D3DLVERTEX pLVertex;
pLVertex.specular= RGBA_MAKE( 255,
0, 0, FOG_DENSITY);
SetRenderState(
D3DRENDERSTATE_SPECULARENABLE, TRUE);
Ejemplo con OpenGL:
Glfloat mat_specular[]= {1.0, 1.0,
1.0, 1.0}
glMaterialfv( GL_FRONT, GL_SPECULAR,
mat_specular);
Alpha Blending. Con
este efecto se puede dar a los objetos la propiedad de transparencia,
pudiendo hacer que cada elemento posea un grado mayor o menor de
transparencia (por ejemplo, para hacer una bola de cristal, un vaso,
etc.).El chip permite usar
atributos de color como Fog, luz especular...
Ejemplo con DirectX:
Activar este efecto es sólo
cuestión de poner a TRUE una bandera y dar unos valores a dos
variables:
SetRenderState(
D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
SetRenderState(
D3DRENDERSTATE_SRCBLEND, <D3DLEND FLAG>);
SetRenderState(
D3DRENDERSTATE_DESTBLEND, <D3DBLEND FLAG>);
El parámetro D3DBLEND FLAG
puede ser: ZERO, ONE, SRCCOLOR, INVSRCCOLOR, DESTCOLOR, INVDESTCOLOR,
BOTHSRCALPHA o BOTHINVSRCALPHA.
Ejemplo con OpenGL:
glEnable( GL_BLEND);
glBlendFunc(<SOURCE_FLAG>, <DESTINATION_FLAG>);
Alpha Testing.
El chip i740 soporta el uso de
funciones de testeo de Alpha Blend. Con ello, el usuario puede
controlar como se aplica el efecto a los objetos en la escena.
Ejemplo con DirectX:
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,
TRUE);
SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,
TRUE);
SetRenderState(D3DRENDERSTATE_ALPHAFUNC,
<D3DCMPFUNC>);
SetRenderState(D3DRENDERSTATE_ALPHAREF,
<ALPHA REF>);
El parámetro <D3DCMPFUNC>
puede ser uno de estos valores: D3DCMP_NEVER,
D3DCMP_LESS,D3DCMP_EQUAL, D3DCMP_LESSEQUAL, D3DCMP_GREATER,
D3DCMP_NOTEQUAL, D3DCMP_GREATEREQUAL o D3DCMP_ALWAYS.
Por otro lado, el parámetro <ALPHA
REF> debe ser un número que especifique un valor de
referencia Alpha para los pixels que se testeen cuando este modo se
encuentre activado.
Ejemplo con OpenGL:
Con OpenGL, su activación es
más sencilla, y el código sería el siguiente:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(<GLFUNC>, <GLREF>);
En el ejemplo, <GLFUNC> puede
ser GL_NEVER, GL_ALWAYS, GL_LESS, GL_EQUAL, GLGEQUAL, GL_GREATER o
GL_NOTEQUAL y el valor <GLREF> debe estar comprendido entre 0 y
1 (como siempre en OpenGL).
Difuminado de color. Este
efecto (en inglés Color Dithering), consiste en que cuando un
patrón de pixels (una textura) que posee varios colores
bastante juntos se coloca a una distancia del observador en imagen
como para que no quepan todos ellos representados gráficamente
(o sea, que haya varios pixels del patrón ocupando un pixel de
pantalla), este mecanismo calcula el nuevo color resultante que se vería
a partir de su mezcla. Este
efecto funciona cogiendo el color de entrada, el valor alpha, el valor
fog y los convierte de un valor de 8 bits a otro de 5 o 6. El efecto
de difuminado simula 256 niveles de color mediante el uso de una tabla
de 32 o 64 pixels.
Ejemplo con DirectX:
Solamente hay que incluir la línea:
SetRenderState(D3DRENDERSTATE_DITHERENABLE,
TRUE);
Ejemplo con OpenGL:
Gl_Enable(GL_DITHER);
Sombreado. El
efecto de sombreado determina como deberán ser interpolados los
colores de cada uno de los pixels de la superficie de cada triángulo
(polígono). Cada atributo de color: alpha, efecto fog, luz
especular y atributos de color se sombrean de forma individual. El
chip i740 soporta dos métodos de sombreado: Flat Shading y
Gouraud Shading. El método
de sombreado Flat hace que cada polígono de un objeto se dibuje
con sólo un solo, es decir, se rellena con color sólido. Por
otro lado, la técnica Gouraud hace que dentro de cada polígono
se hagan progresiones de color entre cada uno de los vértices
adyacentes, de forma que no se podrán diferenciar los límites
de cada polígono ya que no hay saltos bruscos de color entre
ellos.
Uso de Texturas. El
chip Intel740 tiene capacidad para poder manipular una cantidad
ilimitada de texturas (mapas de bits). La razón de ello es que
al ser un acelerador que se instala en sistemas que usan la tecnología
AGP, no usa memoria propia para almacenar las texturas como hacen
todas las placas aceleradoras actuales, si no que usa como memoria
local de vídeo la misma memoria RAM. Como resultado el sistema
puede usar tanta memoria RAM de vídeo como necesite, que es lo
mismo que decir que no se tiene límites (más que los de
arquitectura del chip 32 o 64 bits de espacio de memoria direccionable
y el de la memoria instalada en el equipo). En
texturas, soporta el MipMapping y la interpolación bilinear
Para aquellos que no lo sepan, decir
que la tecnología de bus AGP permite que el chip gráfico
(en este caso el Intel740) pueda acceder a las texturas sin la
necesidad de la intervención de la CPU. Este sistema de buses
de transferencia paralelos, permite que el sistema pueda alcanzar un
ancho de banda de hasta 1.3 Gbytes por segundo.
Además de lo dicho, el chip
posee varias funciones para la manipulación de las texturas y
es compatible con bastantes formatos de textura. A continuación
se detallan estos aspectos:
Formatos de textura soportados. El
chip de Intel soporta el uso de texturas con más de 16 bits de
color en varios formatos, que pueden catalogarse en tres categorías:
ARGB, AYUV y YUB.
La única limitación
que posee el Intel740 es que la dimensión de las textura debe
tener un valor que sea potencia de dos.
Es compatible con 11 formatos de
textura. En la tabla 1
se muestra la lista completa de los formatos soportados por el
Intel740 compatibles con DirectX y OpenGL. Así mismo, en la
tabla 2 se da un ejemplo completo de cómo crear una textura en
memoria convencional desde DirectX 5.
Mezclado de texturas. Esta
es una de las funciones que puede efectuar el chip con las texturas y
consiste en la posibilidad de mezclar los colores de la propia textura
con los del vértice asociado.
Transparencias en texturas. El
chip dispone de dos efectos aplicables a las texturas llamados Texture
Map Chroma Keying y Color Keying. Ambas técnicas sirven para lo
mismo, permitiendo seleccionar un color de la textura para que sea
invisible (sea transparente, no presente), de forma que al dibujar en
pantalla las partes transparentes dejan ver lo que hay detrás
de la propia textura.
La única diferencia que hay
entre ambas técnicas, es que la primera se usa para texturas
paletizadas, mientras que la segunda se usa en texturas sin paleta,
donde en consecuencia, se debe indicar el color transparente mediante
un valor de 16 bits.
Filtrado de texturas. Este
efecto es muy apreciado y da mucha más calidad a las imágenes
3D. Simplemente consiste en que el hardware usa un sistema de cálculo
mediante el cual se consigue que las texturas que se dibujan en las
escenas 3D queden mejor visualmente sea cual sea la distancia (escala)
a la que se encuentren dibujadas. Para
hacer esto, el filtrado de texturas hace que el chip calcule el color
del pixel de la textura que se verá en pantalla según la
influencia de varios factores, tales como es el de la distancia entre
el punto y el observador y el tamaño de la textura en relación
al tamaño con el que aparece en pantalla; de la manera en que
lo veremos, según el procedimiento.
Métodos de filtrado. Sistema
Nearest (de proximidad): Este sistema, también llamado filtrado
de puntos, simplemente usa un algoritmo que pone en cada punto de
pantalla el pixel que más próximo queda en la textura. Este
sistema tiene el inconveniente que cuando la textura en pantalla se
amplia mucho se ven grandes cuadros monocolor (pixels gigantes), lo
que da una apariencia poco realista al conjunto.
Sistema Lineal: Este modo, conocido
también como filtrado bilineal, consiste en que para dibujar
cada punto el chip calcula dos coordenadas cercanas y coloca el pixel
con el color intermedio resultante de ambos (la media). El resultado
de este sistema es que las texturas aparecen más suavizadas en
pantalla, sin tanta pixelación en las ampliaciones.
Soporta resoluciones desde los
640x480 hasta los 1280x1024 este sistema tiene el inconveniente de dar
una apariencia poco realista
Ejemplo con DirectX:
SetRenderState(D3DRENDERSTATE_TEXTUREMIN,
<D3DTEXTUREFILTER>);
SetRenderState(D3DRENDERSTATE_TEXTUREMAG,
<D3DTEXTUREFILTER>);
La variable D3DTEXTUREFILTER puede
poseer los valores:
D3DFILTER_NEAREST,D3DFILTER_LINEAR,D3DFILTER_MIPNEAREST,
D3DFILTER_MIPLINEAR,D3DFILTER_LINEARMIPNEAREST y
D3DFILTER_LINEARMIPLINEAR.
Ejemplo con Open GL:
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER, <FILTER_MODE>);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, <FILTER_MODE>);
En este caso, la variable
FILTER_MODE puede poseer estos valores: GL_NEAREST, GL_LINEAR,
GL_MIPMAP_NEAREST, GL_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST y por último
GL_LINEAR_MIPMAP_LINEAR.
La técnica Mipmapping. Las
texturas pueden verse desde muchas distancias en una imagen 3D, y una
consecuencia de ello es que hay ocasiones en las que algunas texturas
deben aparecer en pantalla más pequeñas de lo que
realmente son (se ven con menos detalle del que realmente tienen).
Cuando pasa esto, si no se aplica ningún algoritmo especial, el
resultado es que la imagen se dibuja como si tuviese un efecto de
interferencias o nieve (que se nota más todavía si la
imagen está en movimiento como puede ser un simulador). Para
evitar este efecto visual precisamente se usa la técnica
Mipmapping, que consiste en que el sistema posee guardadas en memoria
varias copias de una misma textura cada una de ellas a una escala
menor (cada una la mitad a la anterior aproximadamente). Con esto, el
chip puede elegir según la distancia a la que se encuentra el
objeto la textura con el tamaño que se adapte mejor a la escala
de dibujado en pantalla. De esta forma se consigue que se vea mejor la
textura desde todas las distancias.
La técnica Antialiasing. Este
algoritmo (cuyo nombre se traduciría como antidentado),
consiste en hacer que todos los bordes externos de los triángulos
que forman un objeto aparezcan en imagen sin que se vea la
cuadriculación de los pixels, lo cual se nota mucho por ejemplo
si dibujamos una figura negra con formas irregulares en un fondo de
color blanco. El algoritmo
consiste simplemente en coger los pixels más externos y el
primero que haya en contacto con el borde del fondo, buscar el color
medio entre ambos y dibujar dicho color entre ambos.
Con el método explicado, se
consigue que desaparezca en gran medida el dentado que poseen los
dibujos a causa de que las imágenes estén hechas
mediante pixels (pequeños cuadrados), dando un aspecto
difuminado en los bordes externos, ofreciendo la sensación de
una imagen con más resolución de la que tiene realmente.
El chip puede manejar una cantidad
infinita de texturas
Además de lo anterior, para
que este efecto funcione es necesario que se ordenen todos los triángulos
de la escena de mayor a menor distancia y que se empiece por dibujar
primero los más lejanos.
Ejemplo con DirectX:
SetRenderState(D3DRENDERSTATE_ANTIALIAS,
SORTDEPENDENT);
Ejemplo con OpenGL:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POLYGON_SMOOTH);
Eliminación de caras
ocultas. La técnica
a la que estamos haciendo referencia es también muy usada y
consiste en que el propio chip se encarge de calcular cuáles
son los polígonos visibles para el observador en la imagen
antes de dibujarlos en pantalla (es decir, aquellos que deben aparecer
en imagen) para ahorrar de esta forma que dibuje polígonos
innecesarios, con el consecuente ahorro de tiempo para el usuario y cálculos
para el sistema que estamos utilizando.
Ejemplo con DirectX:
SetRenderState(D3DRENDERSTATE_CULLMODE,
<MODE>);
MODE puede ser uno de estos valores
que citamos a continuación: D3DCULL_CCW y D3DCULL_CW.
Ejemplo con OpenGL:
glEnable(GL_CULL_FACE);
glCullFace(<MODE>);
MODE puede ser: GL_FRONT, GL_BACK, o
GL_FRONT_AND_BACK.
Funciones de aceleración
2d del chipunc. El chip
i740, como ya se ha dicho al principio del artículo, también
posee aceleración para las 2D, lo que resulta muy útil
para un entorno gráfico 2D como es Windows.
Engine: El sistema posee un engine
denominado genéricamente BitBLT (del inglés Bit Data
BLock Transfer) que permite funciones hardware como las de copiar
bloques de memoria de una zona de la pantalla gráfica a otra.
Escalado de bloques: También
ofrece la función que encargada de copiar bloques con el añadido
de poder escalar el tamaño con el que se copiarán los
bloques tanto en la dimensión X como en la Y por medio de un
algoritmo de replicación/interpolación de pixels.
Conversión de formatos: Además
de las características mencionadas, los bloques que se copian
pueden tener formatos de color diferente, pudiendo así por
ejemplo copiar un bloque gráfico con 16 bits de color en otro
de 24.
El sistema posee un engine
denominado genéricamente BitBLT que permite funciones hardware
como las de copiar bloques de memoria
Cursor por hardware: Esta característica
está presente en casi todas las aceleradoras actuales y en este
caso el chip posee 4 Kbytes para el almacenado de cursores a la vez
que soporta seis formatos diferentes.
Otras características.
Además de todo lo explicado
en este artículo, el chip posee otras muchas capacidades que no
se van a mencionar a continuación por salirse un poco del tema
tratado en el artículo, como pueden ser la captura de vídeo,
reproducción en formatos MPEG II, compatibilidad con los
algoritmos usados para DVD, y otras capacidades propias del chip
citado. |