Busquedas

Cómo hacer un Game Engine 3D: Por donde empezar.
Miércoles, 05 de Noviembre de 2008 14:00

Muchos os habréis preguntado como se hace un juego de última generación. Pues es un proceso realmente complejo y que involucra a una gran cantidad de programadores, grafistas, músicos y otras disciplinas más. Pues bien, la parte de programación de un videojuego básicamente se compone a niveles muy básicos de un motor de juego y de la lógica del videojuego.

En este artículo hablare sobre por donde empezar a crear un motor de juego, dando información sobre que es necesario aprender, que hay que leer y como aprender esos conocimientos de manera ordenada para no desesperarse, pues al ser un tema complejo involucra numerosos campos de la programación con y sin reacción entre ellos.

 

programación gráfica

 

 

TAGS: , , , , , , , , , ,

¿Que es un motor de juego?

 

El motor de juego gestiona varios tipos de tareas, aplicando mecanismos de abstracción para que al programar la lógica de nuestro juego no tengamos que preocuparnos de detalles específicos como por ejemplo serían : pintar píxel a píxel un personaje, leer entrada de teclado, comunicación por red u otras tareas que nada tienen que ver con que hace el juego sino mas bien cómo lo hace.

 

Entonces podríamos clasificar el motor del juego con CÓMO se hacen las cosas y la lógica del juego con QUÉ hace el juego.

 

Los componentes básicos(aunque pueden variar) que debe tener un motor de juego 3D son:

- Gestión de la entrada por teclado, gamepads, etc.

- Gestión del audio.

- Gestión de las comunicaciones de red.

- Gestión de la física de los objetos 3D.

- Gestión de los gráficos.

 

He  querido dejar para este último punto la gestión de los gráficos porque es uno de los puntos de mayor importancia en un motor de juego, que a menudo es llamado motor gráfico por la envergadura de este apartado. No obstante tendríamos que distinguir claramente entre motor de juego y motor gráfico. Ya que motor gráfico sería una parte de las que componen el motor de juego.

 

Hay que señalar que un motor gráfico realmente gestiona los gráficos y no sólo enmascara a la API que utiliza. Esto es importante tenerlo claro, pues a menudo nos encontramos con que algunos programadores confunden un wrapper con un motor gráfico.

 

Un ejemplo de wrapper sería hacer una función que por ejemplo pintara un objeto 3D de manera ortogonal:

 

Se le pasaría un objeto, aplicaría unas transformaciones sobre la vista y por ultimo pintaría el objeto representándolo de manera ortogonal.

 

Entonces, en nuestro programa podríamos tener llamadas a nuestra función de pintar objetos 3D con perspectiva  ortogonal. Pero si nos damos cuenta esta función es como una macro, lo único que hace es agrupar varias funciones de la API para que realicen una tarea más general.

 

Por otro lado un motor gráfico gestiona, ordena, y decide que pintar, con que características pintar cada cosa y que flags activar en cada momento.

 

La linea es estrecha y fácil de cruzar, pero a menudo hay muchas opiniones sobre si algo es un motor gráfico o si  sólo es un wrapper.

 

¿Programar nuestro propio engine o usar uno ya hecho para hacer juegos?

 

Algunos programadores de videojuegos querrán ir al grano, no pararse en implementar el motor de juego y usar un game engine 3D ya hecho para ahorrar tiempo y dolores de cabeza.

 

Pero ¿Se puede ser un buen programador de videojuegos sin saber como funcionan todos los procesos inferiores?.

 

Tal vez podamos responder con otra pregunta: ¿Se puede ser un buen programador gráfico sólo conociendo las funciones de la API sin conocer el pipeline de rendering y cómo funciona?

 

Dejo estas preguntas ahí, aunque yo tengo mi propia opinión. Solo os daré un proverbio que ley hace un tiempo y puede aplicarse a este tema :  "Para poder apreciar el cielo hay que haber descendido antes a los infiernos".

 

¿Que alternativas tengo para el desarrollo?

 

Una de las primeras elecciones sobre las tecnologías y herramientas que se usarán es el lenguaje de programación con el cual implementaremos el videojuego.No hay una regla fija sobre cual elegir, pero el 99% de los juegos profesionales están programados en C++. Este lenguaje nos permitirá usar características de orientación a objetos y implementar nuestro motor de una manera más rápida y eficiente.

 

Además debemos elegir las API's o librerías que nos permitan gestionar el input, el audio, la red o los gráficos. Aquí hay varias alternativas y unas tienen unas ventajas sobre otras.

 

No obstante la forma adecuada de programar nuestro engine es usando interfaces y permitir tener implementaciones paralelas con diferentes API's para gestionar lo mismo.

 

Es decir el engine nos dará funcionalidades e internamente gestionara sonido, gráficos u otras cosas pero esto debe ser independiente de la API que se use. Por ejemplo nuestro motor gráfico podría darnos la oportunidad de elegir que API gráfica usar para pintar los gráficos: DirectX o Opengl, pero el motor deberá hacer lo mismo se use una u otra indistintamente.

 

Si queremos programar un engine multiplataforma y libre podríamos usar las siguientes API's y librerías:

- SDL para input y network

- OpenGL para gráficos

- OpenAL para sonido

- Bullet o ODE para física.

 

No obstante hay otras alternativas que aunque más usadas tienen la limitación de ser monoplataforma. Estoy hablando de DirectX que está formada por partes como DirectInput, Direct3D, Direct Audio o una parte de gestión de comunicaciones de red. En este caso los componentes serían por ejemplo:

- DirectX para input, audio, network y gráficos

- Havok o Physics para física.

 

Decisión sobre la API gráfica: DirectX o OpenGL

 

Esta decisión asalta a todos los programadores de videojuegos en un momento u otro y hay muchos hilos de debate en internet sobre cual de las dos API's es mejor o cual tiene más funcionalidades.

 

A grandes rasgos las dos APIs hacen lo mismo, permiten usar la tarjeta gráfica para pintar los elementos en la pantalla. 

 

Por un lado DirectX añade funcionalidades en sucesivas versiones y por el otro OpenGL añade funcionalidades mediante extensiones o librerías

 

Atrás quedaron los tiempos de DirectX 8 en que pintar un triangulo en pantalla costaba 3 veces mas que en OpenGL. Pues lo cierto es que a medida que DirectX y OpenGL añaden nuevas mejoras y funcionalidades se hacen cada vez más cercanos. Quizas ahora y es cuestión de tiempo que se igualen, DirectX 10.1 está un poco por delante en cuanto a features respecto a OpenGL 3.0,

 

Así pues la decisión depende de cada uno, pero el usar una API u otra no es importante, lo importante es cómo hagamos nuestro motor gráfico y de hecho no está de más que el motor gráfico pueda usar las dos API's permitiéndonos elegir cual usar.

 

¿Por donde empezar?

 

A continuación daré una recomendación sobre que libros leer para adquirir los conocimientos necesarios para aprender a implementar nuestro motor de juego. Me centraré principalmente en aspectos del motor gráfico, que aunque no es lo único importante, es la parte más grande y compleja.

 

El orden de lectura que propongo está organizado de tal manera que dejamos para el final los libros que más conocimientos nos requieren para poder entenderlos completamente.

 

Todos los libros que recomiendo están escritos en Ingles pues en este ámbito de la programación de gráficos hay muy poco contenido en Español y no tienen a menudo la profundidad necesaria para nuestro proposito.

 

La bibliografía que propongo se centra en el caso de que queramos implementar un motor gráfico multiplataforma usando OpenGL, pero no obstante se pueden sustituir los libros específicos de OpenGL por libros de DirectX sin cambiar el orden de lectura y aprendizaje.



 
 

Propongo comenzar dándole duro a C++. En este libro se centran no sólo en aprender como programar en C++ sino en que estrategias nos serán mas óptimas en el tema de rendimiento y uso de memoria.

 

Podremos aprender como usar la librería STL y entender cuando merece la pena usarla o no.

 

También aprenderemos a usar Templates, Plugins y  tecnicas específicas para programación de videojuegos.

   
   
 

Pasamos a los gráficos, y sin duda el libro por donde empezar es este: "Real-time Rendering" en su tercera edición.

 

Hace poco tiempo me dijo un amigo una frase que creo que lo define por completo : "Si sólo se puede comprar un libro sobre gráficos la elección está clara, este es el libro".

 

En el se trata todo, es la biblia de los gráficos en tiempo real. Está muy actualizado con respecto a los últimos avances y cubre todos los conceptos teóricos sobre gráficos y matemáticas que necesitaremos en el futuro.

   
   
 

Bajamos un poco más en el nivel de especialización y con este libro comenzaremos a aprender a escribir código OpenGL. No nos resultará difícil pues los conceptos teóricos que tendremos si hemos leído antes el libro anterior serán mucho más que suficientes.

 

Este libro es de nivel principiante/medio y cubre aspectos como algunos de los siguientes:

- Teoría básica de gráficos

- Polígonos, Colores, Iluminación, Transparencias y Fog

- Bipmaps en OpenGL

- Texture Mapping

- Extensiones de OpenGL

- Capítulo sobre optimización de rendimiento

- OpenGL Buffers

- Juego final de ejemplo

   
   
 

Este libro además de ser tres veces más grueso. comienza justo donde se queda el anterior y ya abarca un nivel avanzado de complejidad.

Cubre aspectos como:

 

- VBO, PBO, FBO

- Low Level Shaders y High Level GLSL Shaders 

- Texture Mapping avanzado

- Iluminación y sombreado avanzado

- Multitud de efectos especiales como Normal Mapping, Parallax Mapping, Bloom, Glow, Blur, Particulas, Billboards, Reflexiones ...

- Renderización de naturaleza

- Sombras

- Terrenos

- Modelos 3D y esqueletos

- Gestión de la escena, Portals, BSP ..

   
   
 

Si hemos llegado hasta aquí ya nos tendremos una sólida base y ya empezaran a fluir ideas sobre cómo hacer nuestro motor gráfico, pero realmente merece la pena que con los conocimientos que tenemos leamos este libro. Ya que si bien no se centra en ninguna API específicamente si que nos ilustra de manera muy amena sobre como debe ser diseñado el motor gráfico de la manera más eficiente y profesional posible.

 

Principalmente y como ya he dicho se centra en cómo diseñar el motor gráfico pero además cubre aspectos no tratados en la bibliografía anterior como: 

 

- Creación de un formato 3D propio con capacidades de animación mediante esqueletos.

- Optimización de funciones 3D mediante el uso de instrucciones mmx, sse, sse2 ...

- Gestión de red, audio, time, input.

- Creación de un shooter como motor y juego finales.

   
   
 

Estamos llegando al final de mi lista de recomendaciones, pero no sin antes detenernos en este último libro.

 

Si hemos leído todos los anteriores tendremos claras muchas cosas, ya sabremos la estructura de nuestro motor gráfico, como implementar y gestionar cada cosa pero a estas alturas nos faltará tener una buena librería de Shaders a nuestra disposición. La mejor manera de crear esa lista es con este libro.

 

Es uno de mis favoritos y trata única y exclusivamente sobre la programación de Shaders en HLSL y GLSL, es decir los lenguajes de especificación de Shaders de DirectX y OpenGL respectivamente.

 

Tiene código fuente de ejemplos, aunque más importante es la base teórica de cómo implementar los métodos que  es lo que mejor está.

 

Además una de las cosas que más me gusta es que los ejemplos son de juegos comerciales, los propios programadores hablan sobre como implementaron sus efectos.

 
 

Aquí acaba mi dura lista de libros a leer. En este punto debemos tener los conocimientos y la base necesaria para enfrentarnos a cualquier cosa en el ámbito de la programación gráfica. Como ya supongo si alguien va leyendo los libros en este orden ira haciendo sus pruebas y implementando su motor gráfico y si no este es el mejor momento para comenzar.

 

Aunque muchos os estaréis preguntando donde me he dejado los libros de OpenGL por excelencia, es decir el Red Book y el Orange Book. Son libros muy extensos y que están muy bien pero yo los dejaría más como material de referencia, es decir, estarán muy bien acudir a ellos cuando queramos obtener información específica sobre una determinada función o algo concreto. 

 
 
           
 

Tampoco me olvido de las famosas GPU Gems, son libros muy específicos para programadores de videojuegos, y su contenido es bastante avanzado, pero también muy recomendables. Cada uno está compuesto por multitud de artículos individuales. Yo recomiendo lo mismo que con los dos anteriores; cuando ya se tiene la base necesaria están muy bien para leer un artículo determinado cuando nos haga falta para implementar cierta parte.

 
              
 

Hasta aquí el artículo. Espero que ayude a alguien a decidir por donde empezar a leer para convertirse en un buen programador de gráficos y videojuegos.

Si tenéis mas recomendaciones sobre libros dejar un comentario con la información para que todos podamos beneficiarnos.


Si te gustó el articulo sientete libre de subscribete al feed rss
Comentarios (8)
8 Miércoles, 28 de Enero de 2009 17:32
Fernando
Exelente... creo que es lo que estaba buscando. hace tiempo implemente cosas basicas de graficos en c++ puro con librerias hechas para modo x, logre hacer aplicaciones vectoriales para matematica y algunas para fisica... creo q con esto podre hacerlas mucho mas reales para la simulacion.
7 Jueves, 15 de Enero de 2009 15:37
jonathan arboleda
Seria muy interesante poder aplicar la programacion grafica para hacer modulos academicos interactivos en ingenieria y ciencias
6 Jueves, 01 de Enero de 2009 02:04
cristian
muy bueno el articulo y muchas gracias por darnos esta vista como empezar en el mundo de la programacion grafica, no he leido un articulo q se explicara de tan buena forma.
saludos desde argentina
5 Viernes, 07 de Noviembre de 2008 12:44
greenbite
Muy interesante jmpep, voy a buscar información de los libros que me comentas.
4 Viernes, 07 de Noviembre de 2008 02:12
jmpep
Joer, siento no haber coordinado el número de nombres y determinantes en el post anterior, es que tengo sueño y ni en la vista previa me he dado cuenta de los fallos.
3 Viernes, 07 de Noviembre de 2008 02:10
jmpep
Buen artículos, muy compacto, al grano y llenos de buenos consejos :)

Como he puesto en Menéame, antes de empezar con OpenGL yo recomendaría "Essential Mathematics for Games & Interactive applications" de James M. Van Verth y Lars M. Bishop.

Explica las matemáticas tras las Rendering Pipeline y los motores físicos con bastante precisión, de forma amena y comprensible (hasta para mi, que saqué cinco pelao en Álgebra de la carrera :P).

Ah, y una última aportación. Para quien quiera hacer un motor gráfico pequeño, para ir aprendiendo, sin mucha característica, un entorno agradecido son los móviles (en PC o le metes los últimos efectos o un motor pasa sin pena ni gloria). Así pues, recomendaría "Mobile 3D graphics with OpenGL ES and M3G", de Kari Pulli, Tomi Aarni y otros (Morgan Kaufmann series).
2 Jueves, 06 de Noviembre de 2008 22:42
Richar
El artículo merece una felicitación, muy bueno.
1 Jueves, 06 de Noviembre de 2008 15:23
Lalo
Muy bueno tu artículo. Es más sin querer, había seguido esa secuencia de los libros (a excepción del Real-Time Rendering)

Un abrazo.

Agrega tu comentario

Tu nombre:
Comentario: