¿Qué ostias es DirectX?

Buena pregunta, sobre todo teniendo en cuenta que si estas leyendo esto es porque ya sabes lo que es. Aunque de todos modos nunca está de más aclarar algunos conceptos. Así que vamos allá:

- Antes de que la gente usase Windows, había algo que se llamaba DOS... que era el sistema operativo más popular entre los PCs. Los juegos se han programado exclusivamente para DOS durante muchos años. El motivo para no usar Windows para desarrollar juegos era el pésimo rendimiento que éste ofrecía para manejar gráficos y sonido. En 1995 Microsoft nos sorprendió al mundo con DirectX, un conjunto de herramientas que permitía a los programadores manejar gráficos y sonidos con el mismo rendimiento que DOS, y con la ventaja de poder despreocuparse de los drivers del sistema (puesto que cada fabricante provee sus propios drivers a windows).

- DirectX es una API que te permite programar demos, juegos, y aplicaciones 3d en general. Se compone de:

DirectPlay: Funciones de red para internet, network, modem, etc...
DirectGraphics: Calculo de graficos 3D y 2D
DirectMusic: Reproducción de sonido, música, mp3, etc, ...
DirectInput: Manejo del teclado, raton, joystick, volantes, etc..
DirectShow: Permite reproducir videos en general, dvd, mpg, etc...

En estos tutoriales voy a tratar el uso de Direct3D (llamada DirectGraphics desde la version 8 de DirectX), es decir la API que te permitira programar tus juegos 3D y esas demos tan bonitas que a todos nos gustan. sino no se que haces leyendo esto, ostias!

- Y por que DirectX?

porque una aplicacion hecha con DirectX va a correr en cualquier PC aunque no tengas el ultimo modelo de tarjeta, puesto que DirectX automaticamente emula esas caracteristicas mediante software de forma que al menos el juego funcione.

porque es más fácil aprender a usar esta API que hacer tu la tuya propia, puesto que la mayoria de funciones ya estan hechas y optimizadas para que funcionen perfectamente.

tambien puedes probar con otras APIs como son OpenGL, yo particularmente prefiero DirectX porque me mola Bill Gates XDDD. No, en serio... OpenGL es también una API muy buena para programar cualquier tipo de juego, incluso es compatible con entornos UNIX, pero DirectX ofrece muchas más posibilidades porque incluye DirectMusic y DirectInput en la misma API.

- En una palabra DirectX es un conjunto de librerias para programadores de windows que deseen realizar cualquier tipo de juego para PC. (según parece, tambien va a ser posible programar los juegos para la consola XBOX de microsoft con la misma API de DirectX)

 

¿Qué ostias es DirectX? (y II)

pensaras... vale, muy bonita la introducción, pero eso ya lo sabia yo! :-)

ok ok, asi que quieres algo mas de "chicha", pues alla vamos.

voy a explicar brevemente en que consisten los dos puntos claves de la programación con DirectX: el HAL y el COM

 

- Direct3D HAL

El gráfico muestra la relación que existe entre la API Direct3D, HAL y el GDI (Graphics Device Interface) de Windows:

El HAL sirve para acceder a la tarjeta de video a traves de los drivers. Es el dispositivo principal sobre el que se trabaja. Si tu tarjeta de video soporta Direct3D, el HAL estará disponible en el sistema para trabajar. Si no, la emulación por software que DirectX realizará debería ser totalmente compatible con el HAL, aunque debes comprobar las capacidades de la tarjeta que usas antes de usarla, por supuesto. Si no no dispones de una tarjeta de video aceleradora 3D no podrás crear un dispositivo HAL.

- Emulacion por software

Como decia antes, si no tienes una tarjeta 3d... macho, comprate una que ya es hora. si vas a programar aplicaciones 3D necesitas sobretodo una buena tarjeta 3D. Personalmente te recomiendo una GeForce o cualquiera que lleve incorporado el chip NVIDIA.

Asi que si intentas correr tu programa 3D sobre una tarjeta cutre la mayoría de las funciones van a ser emuladas por software, lo que hace trabajar mucho más a la CPU y por supuesto no se va a ver con la misma calidad que con una buena tarjeta. De cualquier forma debes comprobar antes de usar cualquier característica avanzada de Direct3D si el dispositivo de video que este funcionando en ese momento es capaz de trabajar con ello o no, de otra manera el programa fallara.

- COM

Tarde o temprano cualquier programador de C para windows se las va a tener que ver con COM.
DirectX está basado totalmente en tecnologia COM (al igual que otras muchas APIS que Microsoft está lanzando ultimamente) Básicamente COM es un componente sofware que provee servicios a traves de interfaces, y una interfaz es un grupo de metodos relacionados. Un componente COm es generalmente un fichero .DLL que puede ser accedido de varias maneras definidas por las interfaces.

>Joer tio, no me he enterao de nada, me lo repites en cristiano por favor???

pues mira tio, lo que realmente importa del COM es lo siguiente:

- las interfaces de un componente COM nunca puede cambiar.

- COM es independiente del lenguaje de programacion

- Solo puedes acceder a los metodos de un COM, nunca a los datos.

Cada vez que un objeto COM necesita ser actualizado, se crea una interfaz totalmente nueva y se mantienen las anteriores, de esta forma se asegura la compatibilidad con los programas que utilizen las interfaces previas. Es por eso que en la ultima version de DirectX (actualmente la 8) todavia se encuentren disponibles las interfaces IDirect3D2, IDirect3D3, IDirect3D7, etc...

Gracias a que COM es independiente del lenguaje, puedes programar aplicaciones 3D desde Visual C++, Visual Basic o Delphi.

 

¿Qué necesito saber para empezar a andar?

>Si, vale ya de teoria que tengo dolor de cabeza!! dime que me hace falta saber para empezar a programar con DirectX

Ok, lo primero que llama la atencion al ver codigo de un programa que usa DirectX es la forma en que se llaman a las funciones, esto es debido de nuevo al uso de COM:

 

- COM

Para llamar a un metodo de un componente COM, has de usar una "tabla v".
No, no me he vuelto loco... que que es una tabla v ??? mira el siguiente ejemplo:

hr = m_pd3dDevice -> lpVtbl -> SetLight( m_pd3dDevice, 0, &light);

Se llama a los metodos de una interfaz pasando el puntero this, llamado lpdd, como primer argumento del metodo. Y haciendo referencia al metodo de la interfaz usanto un puntero a la tabla-v de la interfaz, que en el ejemplo se llama lpVtbl

Con C++ los objetos COM y los objetos C++ son compatibles a nivel binario, de modo que el compilador maneja interfaces COM y clases abstractas de C++ del mismo modo.

Lo que quiere decir que, el puntero lpVtbl es referenciado de manera implicita, y el parametro es pasado tambien implicitamente. Asi que la sentencia anterior escrita en C, quedaria de esta manera en C++:

hr = m_pd3dDevice -> SetLight( 0, &light);

Podemos decir que en general, la mayoria de las llamadas a DirectX en C++ se parece a esto:

lpinterfaz -> nombremetodo

 

- includes

>Pero digo yo que tendre que poner algun #include en mi programa, no?

si, no solo un include sino tambien añadir algunos parametros en tu proyecto, ejecuta el Visual C++ y vete al menu Tools->Options->Directories

- añade C:\MSSDK\INCLUDE en la pestaña "Include files"

- añade C:\MSSDK\LIB en la pestaña "Library Files"

Esto es comun a todos los proyectos, pero ademas has de configurar en cada proyecto las librerias que vas a usar.
En el menu Project->Settings->Link añade los ficheros .lib que vayas a usar, para empezar puedes añadir los siguientes:

- ddraw.lib d3dx8.lib d3dxof.lib d3d8.lib winmm.lib dxguid.lib

Por ultimo debes añadir los ficheros Include (esto es .h) que vayas a usar en tu programa. fijate en los ejemplos del tutorial para ver cuales hacen falta y para que.

 

- DirectX SDK

todos estos ficheros los vas a poder encontrar en el SDK de DirectX. Esto es principalmente las librerias listas para usar por el programador. Puedes bajarlas directamente desde www.microsoft.com o encontrarla en los cdroms que acompañan a la mayoria de revistas de programacion.

Cuando instales el DirectX SDK se instalara por defecto en la carpeta C:\MSSDK de tu disco duro. Tambien podras elegir entre dos modos de instalacion "Retail" o "Debug". Te recomiendo que instales la segunda opcion ("Debug") ya que aunque sea un poco más lenta, te permittira mas adelante depurar tus aplicaciones.

 

- Crear tu primera interfaz IDirect3D8 !!

tan facil como:

LPDIRECT3D8 g_pD3D = NULL;

m_pD3D = Direct3DCreate8 (D3D_SDK_VERSION);

Lo unico que deberias pasar siempre a Direct3DCreate8() es D3D_SDK_VERSION. No te preocupes de mas por el momento.

El puntero a la interfaz que consigues con el codigo anterior, te permite llamar a tu primer metodo y crear el dispositivo de video:

if (FAILED(g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))

Este codigo crea el dispositivo de video en el adaptador por defecto usando el flag D3DADAPTER_DEFAULT.
Tambien indicas que prefieres un dispositivo Hardware mejor que Software con D3DDEVTYPE_HAL.
Por ultimo con D3DCREATE_SOFTWARE_VERTEXPROCESSING le decimos que use software para procesar los vertices. joer, que ya lo explicare mas adelante, por el momento es suficiente.

 

- VARIABLES

>vale tio, muy guay, pero lo que no entiendo porque pones esos nombres tan raros a las variables. no es mas facil llamarlas de otra manera?

pues si, tienes razon. de echo puedes llamarlas como te salga de la poya :-) pero todos los ejemplos del SDK vienen en este formato, y además es un estandar mundialmente aceptado que todos los programadores utilizen estos nombres raros para llamar a las variables... A mi no me mires con esa cara! la culpa la tiene un tio que era bulgaro y que dijo que las variables deben llevar prefjos segun el tipo que sean. De modo que tenemos:

Prefijo Tipo Ejemplo
w WORD wVelocidad
dw DWORD dwResultados
f FLOAT fVelocidad
d DOUBLE dDireccion
p pointer pArray
m_v D3DVECTOR / D3DXVECTOR3 m_vLuz
l LONG lPitch
s string sPregunta
sz string acabada en byte 0 szPregunta
h handle hResultado
I interfaz COM IDirect3D
m_p puntero a un miembro de la clase m_pVerticesSuelo
m_f float miembro de la clase m_fTiempo
c constante cTexto
b BOOL bFlag

Además:

- Todas las clases deben comenzar con la letra C mayuscula.

- Los metodos siempre empiezan con mayuscula, al igual que la primera letra de las partes que compongan su nombre (ejemplo CrearDispositivo3D), y no se permite el caracter _

- Tipos y Constantes van en mayusculas, y puedes usar el caracter _ (ejemplo #define PUNTOS_VIDA 10)