ADMINBLOG PROYECTOSDESCARGASNORMASACERCA DE
Blog de Miguel Herrero
Enlaces variados sobre gráficos

No me gusta hacer posts de estos que no tienen contenido per-se. Pero estos enlaces me han alegrado el día, y se los recomiendo a todo el mundo que le interese la programación de videojuegos. No sé si sirven para aprender demasiado, pero son amenos:

  • Carmack on OpenGL: Un artículo de John Carmack escrito en el 96 hablando de porqué OpenGL es mejor que DirectX.
  • Immediate Mode GUI: Un post explicando una “nueva” forma de estructurar las interfaces de usuario. En el primer post hay un vídeo explicando todo el tinglado. En cuando empezó a explicarlo me acordé de Waaghman, así que espero que si lo ve, le guste.
  • Design Document Templates: La manera de plasmar todo el contenido de un juego en un documento bien estructurado.
 
Stunt Challenge? Oui!

Hace unas semanas nos llegó a Rodri y a mí un correo muy peculiar. El remitente era un francés que nos preguntaba si íbamos a seguir con el desarrollo de Stunt Challenge. Para el que no lo sepa, se trata del PFC que hicimos para la EUITIO. Y, aunque nos divertimos (y a veces no tanto) mucho en su desarrollo, se arreglaron los fallos más importantes en una versión 1.1 y se paró el desarrollo.

Después tuvimos intentos de artistas que querían incluir mejores modelos en el juego, aunque la cosa no fue a más. El tipo francés nos pedía fundamentalmente dos cosas: traducción al francés y soporte para Windows Vista. Evidentemente, ni sé francés ni soy capaz de instalar Windows Vista (malditos drivers SATA de Fujitsu).

Tras explicarle mis problemas, le dije que podía hacerlo él mismo, pues toda la información del juego estaba en archivos xml. Me preguntó si podría crear nuevos coches o modificar los existentes, porque le gustaba mucho y jugaba bastante a menudo. Le expliqué un poco el formato de los ficheros y tras intercambiar dos o tres correos más, me dijo que había empezado a hacerlo.

En fin, ¡sorpresas te da la vida!

 
Stencil Shadows

No puedo evitarlo. Me encanta este algoritmo pese a la gran cantidad de recursos que dispone. Además puede implementarse tanto por software (como en Blade, que al tirar de CPU corría perfectamente en portátiles con tarjetas cutres) como por hardware (no totalmente, pero las partes más importantes de cara al rendimiento).

Muchos sabréis a qué técnica me refiero si digo que todas las sombras del Doom 3 y sucesores (Quake 4 y Prey, por ejemplo) están hechas utilizando esta técnica. Principalmente, mi interés por este algoritmo es porque es totalmente genérico, y fue por esto por lo que John Carmack decidió utilizarlo. Como desventajas, que depende mucho de la geometría de los objetos y que las sombras generadas son “duras”, es decir, que hay demasiado contraste entre la zona sombreada y la que no.

El algoritmo se divide en una serie de pasos. El primero consiste en generar la silueta del objeto que va a arrojar la sombra. Evidentemente, esto nos dice dos cosas: que el algoritmo va a tardar más cuantos más polígonos tenga el objeto y que hay que tratar cada objeto de forma independiente, por lo que cuantos más objetos tengamos en pantalla, peor. También hay que tener en cuenta que la silueta se utilizará para arrojar la sombra a partir de ella, luego no se permiten objetos con agujeros, como pudiera ser un donut, pues la silueta sería una circunferencia SIN agujero. Se podría solventar dividiento el donut en dos partes.

Para agilizar los cálculos, muchos juegos utilizan modelos con menos polígonos para el cálculo de sombras. Esto puede verse claramente en el Crazy Taxi o, más recientemente, el Toca Pro Race Driver 3. Para calcular la silueta, se eligen las aristas cuyos puntos tienen la normal con mayor ángulo respecto a la posición de la luz. Evidentemente, si un polígono está “de espaldas” a la luz, no se tiene en cuenta.

Una vez que se ha hecho esto, se tiene una lista de aristas que representa la silueta del objeto. El siguiente paso consiste en crear un volúmen (denominado shadow volume) extruyendo dicha silueta. Para ello se suele sumar un vector a cada punto, que es el vector iluminación multiplicado por una constante. Es muy importante calcular bien esta constante o la sombra podría atravesar varias paredes, si el volumen las atraviesa. En esta operación de extrusión es dónde se suele implementar, si se desea, código en un vertex shader en la GPU.

Una vez tenemos el volumen, se le colocan las dos tapas pues, hasta ahora, solo era un “cilindro” deformado, por decirlo así. Ahora hay que utilizar el stencil buffer, que es algo así como una máscara del photoshop. Al poner el cilindro en ése búfer, tenemos una máscara con la forma de ese cilindro vista desde la cámara. Se procede a pintar con iluminación ambiental (que suele ser bastante oscura) y luego se hace otra pasada puntando la iluminación estándar solo FUERA de la máscara definida en el stencil búfer. Es decir, este método lo que hace no es añadir sombras a la escena, sino NO iluminar esas zonas.

Este algoritmo tiene varias pegas. Lo que os he explicado aquí es la versión más sencilla del algoritmo, pero tiene un problema fundamental. Los polígonos solo tienen una cara visible. Si se les da la vuelta no se ven, es decir, no aparecen en el render. Por ello, si nos encontramos DENTRO del volumen de sombra, estamos viendo de espaldas todos los polígonos. En cuanto nos metamos dentro del volumen, no habrá ninguna sombra, pues el stencil buffer estará vacío, porque todos los polígonos están “de espaldas”.

Para solventar este proceso existe una variante del algoritmo. Podéis buscar información sobre ambos métodos por sus nombres técnicos: z-pass y z-fail. Evidentemente, dicha variante es mucho más compleja y necesita más recursos, por lo que se suele emplear el método sencillo siempre si la cámara no se encuentra dentro de ningún volumen.

Evidentemente, me faltan muchas cosas que explicar, como la manera de conseguir distintos niveles de sombra si existen varias fuentes de luz. He dejado en el tintero varias técnicas y variaciones (como la afamada, Carmack’s reverse) pero al menos espero que hayáis entendido la idea general. Y ojalá consiga implementarla algún día :D

Enlaces:

  • Ozone3D: Información genérica y eliminación de artifacts
  • MSDN: Descripción completa y ejemplo simple
 
Gafas nuevas

Las gafas que llevo utilizando los últimos 4 años ya no dan más de sí y he tenido que comprar unas nuevas. Las viejas todavía las utilizaré en casos de emergencia, o en situaciones concretas ya que las nuevas son bastante más delicadas. Evidentemente, no me he podido librar de que tengan forma rectangular, aunque he intentado que no sean las típicas que tiene hasta jesucristo.

Aunque al principio he tenido algunos problemillas (he tenido que ir 3 veces a la óptica a que me ajustaran la montura, porque me hacía daño en distintos puntos) ahora ya parece que se van a quedar así. Ahora vamos a lo que vamos:

Las viejas…

…y las nuevas

Todavía sigo con ganas de tener unas completamente redondas como Kubrick u Ozzy, pero todo se andará.

P.D.: Madre mía como están los servidores de Google últimamente. He tardado un montón en poder copiar la dirección de las fotos porque no cargaba el dichoso Picasa Web :(

 
Los profesores de mi vida: Asensio

Qué puedo decir de Asensio. La información general nos dice que es el profesor de Fundamentos de Ingeniería del Software (antes conocida como Ingeniería del Software a secas) y que da clase en la EUITIO. Corren muchísimos rumores acerca de sus métodos de enseñanza. Y la mayoría son ciertos me temo.

Cuando me dio clase, recuerdo que ponía las transparencias a una velocidad endiablada. Para poder pillar todo había que escribir de forma ininteligible, similar a los garabatos de un médico diestro escribiendo con el pié izquierdo. Porque NO nos iba a dar las transparencias, según él, para que atendiéramos en clase (cosa que tiene parte de lógica).

Yo sabía que esos apuntes, tras unos días de reposo, iban a ser imposibles de leer, así que decidí redactarlos en el ordenador de forma ordenada. Esos son los apuntes que podéis descargar en la sección de Descargas de este blog. Y eran unos apuntes literales de lo que se decía en clase y lo que mostraban las transparencias. Estoy orgulloso del resultado de esos apuntes y muchísima gente los utilizó para estudiar y aprobar la asignatura (aunque soy consciente de que el temario ha podido cambiar a lo largo de los años).

Hasta el propio profesor me preguntó si yo era el de los apuntes, y en el curso siguiente, consciente de que la gente iba a tener en mis apuntes prácticamente todas sus transparencias, dio sus propias transparencias al dominio público. Todavía recuerdo estar en la cola de la corrección del primer examen, escuchar a un chico preguntar si los apuntes eran fiables y rápidamente respondieron varios que era lo que se daba en clase de forma literal. Yo dije que conocía al que los hacía y que eran fiables. Fue una situación curiosa.

Volviendo al tema del método de enseñanza de Asensio, ya habíamos oído que sus exámenes eran puramente teóricos y que quitaba puntos por todo. Cuando llegó el primer examen, muchísima gente suspendió, creyendo que les había salido bien (yo entre ellos).

Cuando fuimos a la corrección (con una cola de, pongamos, 40 personas de media) iban entrando y saliendo de uno en uno. Todos con la misma cara, NADIE había conseguido aprobar. Cuando llegó mi turno, no daba crédito. Allí nos recibía con una sonrisa en la cara (estuvo muy amable, todo hay que decirlo) mientras que nos invitaba a sentarnos.

Nos explicaba su método de corrección: él tenía a su lado el examen perfecto y en el otro lado el nuestro. Su puntuación comenzaba en 10 e iba bajando según encontraba diferencias. Había momentos en los que resultaba frustrante, porque el emplear sinónimos u ordenar de forma diferente una enumeración eran motivos de bajar puntos. Como él decía, “no habíamos entendido el concepto”.

Lo más gracioso, es que él se las apañaba para que pensásemos que no había podido hacer nada, puesto que a la mayoría nos subía la nota lo suficiente como para que se viera que era generoso y comprensivo pero NUNCA lo suficiente como para aprobar.

Cuando salí de la corrección me sentía totalmente inútil porque él había manejado la situación. Y de qué forma. No había manera de reprocharle nada, y él estaba atento y cordial todo el rato. Gracias a Dios , aprobé en la siguiente convocatoria. Y he de decir que es la única vez en toda la carrera que he copiado. Llevé todos mis apuntes en formato txt en el móvil y los utilicé todo lo que pude sin que me pillaran. Y no me arrepiento porque, lamentablemente, no soy una enciclopedia humana.