| Artículos | 01 JUL 1998

Aplicaciones tridimensionales con Direct3D

Tags: Histórico
Eugenio Barahona.

Aplicaciones tridimensionales con Direct3D

La API Direct3D forma parte del conjunto de APIs que se engloban bajo la denominación genérica de DirectX . Mediante las funciones que forman parte de DirectDraw, Direct3D, DirectPlay, DirectSound y DirectInput el programador tiene acceso a una enorme cantidad de funciones mediante las que es posible acceder a funciones dependientes del hardware de una forma totalmente independiente del dispositivo . Microsoft creó estas API para que los desarrolladores de aplicaciones multimedia y de juegos para PC abandonaran el desarrollo de software para DOS, de forma que todos los nuevos programas que se lanzaran al mercado corrieran bajo Windows 95 o Windows NT .

Si bien es cierto que Direct3D proporciona acceso a servicios de aceleración por hardware de gráficos 3D, hay que tener en cuenta que dicho acceso se realiza a través de una serie de capas de software que tienen como último destinatario a un controlador de dispositivo que es el encargado de realizar el acceso físico al hardware de aceleración 3D . Esta arquitectura hace posible una programación de muy bajo nivel en la que, sin embargo, no es preciso tocar un solo puerto de entrada/salida o un solo byte de las zonas de memoria usadas por los dispositivos instalados en el ordenador .

Direct3D tiene fama de ser una API difícil de usar y que exige al programador una relativamente grande cantidad de trabajo para sólo inicializar los objetos e interfaces que posteriormente se utilizarán durante el transcurso del programa . Esto es cierto, por lo que en el presente artículo vamos a intentar clarificar los pasos necesarios para crear el esqueleto de una aplicación que utilice Direct3D, presentando como resultado de todo ello un sencillo programa que hace uso de aceleración por hardware de gráficos 3D .

Inicialización

El primer paso que se debe dar para crear una aplicación que utilice Direct3D es crear un objeto DirectDraw, ya que a partir de éste se obtendrán punteros a las interfaces de Direct3D que servirán de base para desarrollar el resto de la aplicación . Lo primero que debe tener en cuenta el programador es que en un PC es posible tener instalado más de un dispositivo DirectDraw, es decir, más de un HAL de DirectDraw y Direct3D . Esta funcionalidad hace que, en teoría, incluso bajo Windows 95 sea posible tener configurado un sistema con más de un adaptador gráfico, cada uno de ellos con su monitor . Una configuración de este tipo podría resultar interesante para tareas de desarrollo de software . Por lo tanto es conveniente que el programador implemente una función mediante la que se ofrezca al usuario la posibilidad de elegir el dispositivo que se va a utilizar durante el resto del programa . Esta tarea se puede realizar efectuando una llamada a la función DirectDrawEnumerate, la cual tiene el prototipo que aparece a continuación:

HRESULT WINAPI DirectDrawEnumerate ( LPDDENUMCALLBACK lpCallback, LPVOID lpContext ) ;

El primer parámetro, lpCallback, es la dirección de una función que será llamada por DirectDraw con la descripción de cada uno de los dispositivos DirectDraw instalados en el sistema . El segundo parámetro, lpContext, es una variable proporcionada por el programador y que se pasa a la función a la que apunta el parámetro lpCallback . El prototipo de la función apuntada por lpCallback es el siguiente:

BOOL WINAPI DDEnumCallback ( GUID FAR *lpGUID, LPSTR lpDriverDesc, LPSTR lpDriverName, LPVOID lpContext )

Cada vez que se llama a esta función, el parámetro lpGUID apunta a un identificador global único que el programador puede utilizar posteriormente para realizar la creación de un objeto DirectDraw . Los parámetros lpDriverDesc y lpDriverName apuntan a sendas cadenas de caracteres que proporcionan una descripción y el nombre del controlador al que hace referencia el identificador global único . Si esta función devuelve el valor DDENUMRET_OK el proceso de enumeración de controladores continuará hasta que se hayan enumerado todos los presentes en el sistema, mientras que si se devuelve DDENUMRET_CANCEL el proceso de enumeración se detendrá . Mediante la función DirectDrawEnumerate el programador puede enumerar todos los dispositivos instalados en el sistema para que el usuario elija el que desea utilizar o codificar la aplicación de forma que se escoja el dispositivo que cumpla una serie de requisitos determinados .

Una vez que se haya elegido el controlador que se va a usar para crear el objeto DirectDraw, la creación propiamente dicha se realiza mediante una llamada a la función DirectDrawCreate, la cual acepta tres parámetros, siendo su prototipo el que se muestra a continuación:

HRESULT WINAPI DirectDrawCreate ( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, Iunknown FAR *pUnkOuter ) ;

El primero de estos parámetros es la dirección de un identificador global único mediante el que se designa el controlador que se va a crear gracias a la llamada . Si como parámetro se pasa NULL se utilizará para crear el objeto DirectDraw el controlador de dispositivo de vídeo que se encuentre activo en el momento de realizarse la llamada . Si se pasa un parámetro distinto de NULL se deberá enviar un identificador global único que se haya obtenido mediante una llamada a la función DirectDrawEnumerate . En el caso de desearse utilizar el dispositivo que se comparte con el módulo GDI de Windows se deberá pasar NULL como identificador global único . Si por el contrario lo que se quiere es usar una placa sólo aceleradora 3D, como por ejemplo las basadas en los chips Voodoo y Voodoo 2, se deberá pasar un identificador global único obtenido como consecuencia de una llamada a DirectDrawEnumerate.

Relación con DirectDraw

Direct3D se encuentra íntimamente relacionado con DirectDraw, ya que esta API proporciona las superficies que posteriormente utilizará Direct3D para efectuar las operaciones de render mediante las que se generan los polígonos 3D que forman los objetos que se representan en la pantalla y algunos servicios mediante los que, por ejemplo, es posible realizar intercambio de páginas de vídeo para crear una animación suave y sin parpadeos . Una superficie es básicamente una zona de la memoria de vídeo de la tarjeta gráfica, o de la memoria del sistema, que se utiliza para almacenar un mapa de bits o la propia pantalla que se muestra al usuario en un determinado momento . Existen diversos tipos de superficies, siendo la más importante, sin duda alguna, la denominada superficie primaria, ya que es la utilizada por el GDI para representar el escritorio de Windows y su uso es básico para crear aplicaciones DirectDraw o Direct3D que funcionen en modo ventana .

Para crear el objeto DirectDraw a partir del que se obtienen punteros a otras interfaces relacionadas con la gestión de gráficos tan sólo hay que efectuar una llamada a la función DirectDrawCreate, cuyo prototipo aparece en la sección anterior . La actual versión 5 . 2 de DirectX incluye una nue

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información