Lectura recomendada

Publicado el Domingo 15 agosto 2010 en DirectX por Thund

Aquí os dejo una lista de libros relacionados con DirectX o con la programación gráfica en general que he leído o que conozco. Son todos en inglés, obviamente, y los podéis encontrar tanto en la Amazonia como pidiéndoselos a una mula, que cada cual elija su locura.

Introduction to 3D Game Programming With DirectX 9.0
 

Éste fue el primer libro sobre DirectX que leí. Se me hizo un poco cuesta arriba debido a que, por aquel entonces, mi conocimiento acerca del funcionamiento de una API gráfica era inexistente y mi dominio tanto del inglés como de C++ algo mediocre. Aun así le eché un par de voluntades y me fui enterando de toda la teoría que hay delante y detrás de la programación de una aplicación basada en DirectX. Como el título indica, se trata de una introducción, es decir, toca los palos principales y sin entrar en mucho detalle. Esto no quiere decir que explique las cosas de pasada y te deje más perdío que Marco el día de la madre; se centra en los aspectos más básicos, desde cero, siguiendo una curva poco pronunciada, fácil de seguir. Si te apoyas en la referencia del SDK de DirectX a la par que avanzas por los capítulos, el aprendizaje se verá mucho más reforzado. Está claro que es un libro obsoleto, no sirve a alguien que vaya a emprender su andadura por DirectX 11, pero ésto es una verdad a medias; dado que es un libro introductorio, no hace hincapié en el código y en las particularidades de la API, por lo que hay muchas técnicas y bases descritas que son comunes a cualquier librería del estilo, y que pueden ser de gran utilidad para comprender la arquitectura y la forma de trabajar de cualquier versión. Unas 394 páginas, poca cosa.

Aviso de que quizás, tras haber terminado el libro, no seáis capaces de hacer un dragón rojo echando fuego.

Advanced 3D Game Programming with DirectX 9.0
 

Una extensión del anterior, lo que no quiere decir que empiece donde aquél lo dejó, sino que entra en mucha más profundidad en los temas ya tratados y añade muchos nuevos. Si la introducción abarcaba mayormante el campo de los gráficos, éste tomo expande las fronteras hacia el resto de componentes de DirectX, como son DirectSound y DirectInput, y mete la cabeza en la inteligencia articial y las telecomunicaciones. Digno de mención son el capítulo acerca de la gestión de la escena y los detalles sobre mallas progresivas. No me gustó demasiado la maquetación con respecto a su antecesor. De las 514 páginas puedes saltarte las 60 primeras y luego ir dando saltos, el orden no es importante.

Sí, la portada es fea de cojones.

DirectX 9 Graphics The Definitive Guide to Direct3D
 
Este libro es un intento por cubrir todas las áreas habidas y por haber en torno a los gráficos, aunque se deja un apartado sin cubrir de gran importancia, como son los shaders. Empieza desde lo básico, da una base matemática y en pocas páginas nos encontramos iluminando la escena. Como puntos fuertes tiene la descripción de los archivos .X y su utilización; explica la animación por esqueletos y pieles y mediante keyframes; y es de los pocos que tratan temas de animación de texturas y el uso de DirectShow. En total 351 páginas, recomendable como libro de consulta.
Advanced Animation with DirectX
 
Se trata de un libro más especializado, concretamente en el mundo de la animación mediante código y la interpretación de formatos de animación estándar, como la animación por esqueleto / piel (incluyendo el efecto rag doll), morphing, movimiento de partículas, animación de texturas y efectos de animación de objetos blandos como la ropa. A destacar la explicación del uso de archivos .X de DirectX. Unas 346 páginas en las que no se llega a profundizar demasiado en las técnicas aunque se dan buenas bases. Lo bueno de éste libro es que vale para cualquier API gráfica, aunque en el título aparezca DirectX.
Real-time Rendering Tricks and Techniques in DirectX
 
Éste no lo he leído, más bien lo he usado como libro de consulta. Básicamente hace un breve recorrido por los elementos gráficos de Direct3D hasta que empieza a hablar de shaders. Contiene un montón de ejemplos tanto de pixel shaders como de vertex shaders; lo malo para los programadores que usen DirectX es que tales ejemplos no contienen código HLSL sino ensamblador, lo cual es bueno para los que usen otras APIs como OpenGL (si saben traducirlo a GLSL claro). Al final del libro describe técnicas como el motion blur y el picking, y dedica apartados al stencil buffer y a DirectShow. Unas 827 páginas muy recomendables.
The Complete Effect And HLSL Guide
 
Libro dedicado exclusivamente a shaders, tanto en ensamblador como en HLSL, y al framework de efectos de DirectX 9. Éste sí me lo leí de cabo a rabo porque necesitaba coger una buena base, que fuera especializada, acerca de los shaders. Tiene cosas muy malas y otras muy buenas. Una de las malas es que hay muchas partes que son copy&paste de la MSDN; si quisiera leer la MSDN me iría a la maldita MSDN. En cambio, una de las características más destacables es lo detallado de la información acerca de las equivalencias entre el lenguaje HLSL y el ensamblador, las capacidades de los distintos shader models, desde el 1.0 al 3.0, y una precisa descripción de cada instrucción de la GPU. Sabemos que, a día de hoy, contamos con el shader model 5.0 pero, si nos fijamos bien, nos damos cuenta de que desde la versión 3.0 no ha cambiado demasiado el abanico de funciones ni su comportamiento, aunque sí lo hayan hecho algunos elementos de la semántica y la capacidad del hardware (número de instrucciones permitidas, número de constantes…), casos para los que disponemos de la referencia del SDK o la MSDN. El otro aspecto a remarcar de éste libro es que es de los pocos sitios donde se habla del Effects Framework, que parece siempre como si lo guardaran en secreto por la poca información que se puede encontrar por ahí. A mí me aclaró muchas cosas, por eso lo recomiendo, o si ha salido alguna nueva versión del libro tanto mejor. Se hace cortito, 307 páginas de las que la mitad son tablas.
3D Math Primer for Graphics and Game Development
 
Bases matemáticas para muchas de las cosas que normalmente utilizamos y que damos por sentado. No me lo he leído, pero lo pongo aquí para que se sepa de su existencia. Son 435 páginas.
Geometric Tools for Computer Graphics  
El libro gordo de Petete, 1055 páginas para explicarnos una barbaridad de conceptos y algoritmos matemáticos. Los amantes del álgebra, los espacios vectoriales y la geometría se harán pajas con él. Echando un vistazo al índice (pues no me lo he leído aún) puede verse claramente cómo cubre un montón de aspectos útiles, como la formación de elementos geométricos, intersecciones, partición espacial binaria, triangulación, cálculos de distancias, etc. Por ahí se dice que tiene un montón de erratas, pero en su página web vienen todas aquellas que se han detectado (que oye, son unas cuantas). Recomendabilísimo.
Game Programming Gems  
He decidido poner toda la saga junta porque su descripción es similar y no quiero morirme escribiendo. Muchos ya la conoceréis, se trata de una serie de publicaciones que contienen perlas algorítmicas, técnicas geniales y muy extendidas en la programación de juegos en el ámbito profesional, escritas por veteranos de la industria en muchas ocasiones. Los que no sabíais de su existencia, quedaréis gratamente sorprendidos. Eso sí, yo miraría antes el índice de cada uno antes de comprarlo, ya que cada cual contiene métodos muy dispares, a todos los niveles, no sólo relacionados con los gráficos. Imprescindibles.
Introduction to 3D Game Programming with Direct3D 10
 
Homólogo del anteriormente descrito pero para DirectX 10 (además, escrito por el mismo autor). No lo he leído pero se ve que es lo mismo adaptado a la siguiente versión. Unas 500 páginas.
Advanced 3D Game Programming with DirectX 10
 
La temática es la misma que la de su homólogo de DirectX 9 (y otra vez, coincide el autor). Amplía el contenido acerca de la IA y habla de las curvas beizer y los quads. Este lo he leído un poco por encima. Un total de 527 páginas.
C++ for Game Programmers
 
Este post no es para libros de C++, pero el que he puesto está precisamente orientado a la programación de juegos, o aplicaciones gráficas. Muy recomensable, expone una gran cantidad de trucos, recomendaciones y optimizaciones que todo programador agradece, y siempre hay alguna cosa que se aprende por muy ducho que seas en la materia. Son 434 muy amenas para los amantes de C++.

Hay muchos más por ahí, pero esto es un post no la Biblioteca de Alejandría.

Etiquetas: , , ,

¡A hardcodear!

Publicado el Viernes 2 julio 2010 en DirectX por Thund

Basta de presentaciones, resúmenes e instalaciones varias, vamos a lo que nos gusta que es picar código y ver punticos de colores moviéndose en la pantalla. Tenía pensado en este post enseñar cómo se hace un Modern Warfare 2 pero luego me dije, si eso para esta gente estará chupao, mejor explico cosas más difíciles e interesantes como mostrar una ventana en Windows… Tranquilidad, no es eso realmente lo que voy a hacer, hay millones de tutoriales en la Red para aprender a usar la API de Windows o la MFC para manejo de recursos de intefaz de usuario. Voy a exponer cómo he organizado el proyecto que servirá de base para el resto de ejemplos en este blog.

Estado inicial y Objetivos

Lo primero que he hecho ha sido crear un proyecto Win32 de tipo Windows Application, sin ATL ni MFC (como ya sabéis, la versión Express de VS no las incorpora, ni falta que nos hace). Automáticamente tendremos un fichero .CPP (entre otros) con una serie de definiciones y 5 funciones globales:

  • _tWinMain
  • MyRegisterClass
  • InitInstance
  • WndProc
  • About

Todas ellas están relacionadas con lo mismo, la inicialización y control de la ventana principal, que incluye la ventana-hija típica "Acerca de…" ("About…"). El objetivo es que al final tengamos una función de entrada WinMain que contenga la llamada a la inicialización del sistema y una sentencia return. Además, no debe quedar ninguna definión o constante global.

Transformación

Como a la gente de C++ nos gusta la POO más que a Pedobear la niña de Lazy Town, la idea es aislar el código que será común para todos los futuros tutoriales, encapsulándolo en una clase, de forma que queden mucho más limpios y nos podamos concentrar únicamente en el tema a tratar. Lo único que he hecho ha sido copypastear las funciones a otro archivo y cargarme aquello que no necesitamos, concretamente todo lo relativo a la ventana-hija y el menú superior (File y About). Por tanto, he eliminado lo siguiente:

  • La función About
  • La invocación al cuadro de diálogo de la ventana About, en WndProc
  • Los aceleradores del menú, en _tWinMain
  • Recursos usados por la ventana About, en el archivo .RC

El código ha sido trasladado a una clase que llamaremos EGWindowsHelper y que encapsulará toda la funcionalidad relacionada con el S. O.. En la siguiente tabla pueden verse las conversiones y algunos métodos adicionales que nos serán útiles:

Ámbito global Clase EGWindowsHelper Comentario
_tWinMain Initialize Se mantiene la función global por ser el punto de entrada a la aplicación, pero se mueve su contenido.
MyRegisterClass RegisterWindowClass  
InitInstance InitInstance  
WndProc WndProc Noten los noobs de C++ que es necesario declararla como static ya que no es lo mismo un método estático, que es tratado como una función global encerrada en el ámbito de clase, que un método no estático, que sería considerado un miembro de clase. La referencia al método se realiza de forma distinta y la estructura WNDCLASSEX (en RegisterWindowClass) sólo acepta una referencia a función no-miembro.
  SetFunctionCalledByWndProc Establece la función llamada por la función de callback del bucle de mensajes de Windows cada vez que llega un mensaje a la aplicación.
  GetWindowClassIdentifier Obtiene el identificador de clase de la ventana principal.
  GetWindowHandler Obtiene el manejador de la ventana principal.

 

Modo de uso

He añadido un constructor que acepta los mismos parámetros que la función _tWinMain, de forma que tan sólo hay que pasar tales valores cuando se instancie la clase EGWindowsHelper, y ya tenemos ventana y aplicación funcionando. El .CPP principal queda así de sencillo:

#include "stdafx.h"
#include "EndlessGameEnvironment.h"

using namespace EndlessGame;

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    EGWindowsHelper* windowsHelper = new EGWindowsHelper(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

    return 0;
}

 

Descargas

¡Y eso es todo! Podéis descargarlo desde aquí:

EndlessGameEnvironment.zip (23 Kb)
 

Etiquetas: ,