Sólo Programadores Banner 468x60
Este mes en Sólo Programadores
Contenido del CD-ROM
Índice temático
Suscripción

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.


Banner 468x60
Explorer 4.0, Netscape 4.0. Resolución 800 x 600.
©Tower Communications 1.998.
Diseño: GRUPO ALBERTINA DE COMUNICACION.