Novedades del Blog

miércoles, 29 de octubre de 2008

Modificaciones en la estructura

Llevo unos dias reestructurando el codigo para implementar Shaders de la forma mas generica posible y que se me ocurre, como todavia no se el alcance de la potencia de estos, he intentado crear una estructura lo mas abierta posible.

La primera idea que se me ocurrio era crear una interface Effect con las cosas comunes que tienen todos los efectos (tecnica, nombre de fichero,etc...) y crear clases derivadas de esta para cada efecto a implementar.
Entonces descubri que para hacer el ShadowMapping hacia falta dos efectos, uno que crea la textura ShadowMap y otro efecto que usa esa textura para pintar la escena.
Asi que al final he implementado una clase Shader, la cual almacena los efectos necesarios para crear ese Shader.

Cuando llamo al metodo que pinta el mundo, este llama al metodo de pintado de la Habitacion, este a su vez llama al metodo de pintado de los Shaders que se van a aplicar a la escena, por cada Shader se llama al metodo de pintado de cada Efecto del Shader, por cada Efecto se llama al metodo de pintado de cada Entidad y este a su vez llama al metodo de pintado del Componente que indica si una entidad se pinta o no y al final se pintan las mallas... Jajaja, si ya se que esto es un lio por eso pongo la imagen a continuación que puede aclarar un poco las cosas:



Cualquier duda que tengais no dudeis en poner un comentario y os respondere lo mas rapidamente posible.

jueves, 23 de octubre de 2008

Un poquito de Shadow Mapping

Después de conseguir las luces empezamos ahora con las sombras y de momento parece que bastante bien, anoche acabe la implementación del código pero no estaba del todo bien, ajustando unos parámetros y cambiando algunas variables he conseguido que a priori se muestre la textura Shadow Mapping dinámica que se utilizara junto con las luces para crear un efecto de luz lo mas real posible.

Digamos que la parte mas clara del Shadow Mapping debería ser donde hay mas sombra, en esta imagen se simula que la luz esta mas o menos donde esta la cámara.

Ademas de esta implementación he descubierto un software que me permite tener un repositorio de los ficheros fuente y tener un mayor control de versiones, se llama Subversion, es bastante conocido pero yo nunca lo habia utilizado, ademas es libre.
Tiene una buena cantidad de funcionalidades para poder coordinar la programacion de varias personas con un mismo codigo fuente, pero la utilidad que mas utilizo, es la de crear un repositorio en mi pendrive, lo que me permite tener mi codigo fuente portatil y con control de versiones. Esta practica no es muy aconsejable pero como solo yo estoy tocando el codigo, no tiene porque ocurrir nada raro.

martes, 21 de octubre de 2008

¡¡Por finnnn!!!!

Si señor, por fin he sido capaz de encontrar el problema, y todo por no fijarme bien. Pensando, pensando y pensando por fin he visto la luz al final del camino (nunca mejor dicho jeje ). Al depurar se me ha ocurrido que las normales de las mallas no estaban del todo bien.
Mi primer pensamiento es que la malla estuviera mal exportada, cosa que era un poco complicada ya que no creo que el 3D Max falle en eso.
Y mi segunda opción era que el VertexBuffer que contiene los vértices de la malla no tuviera la información de la normal y efectivamente ese era el problema.
La solución, muy fácil y venia en el tuto de riemers, lo había visto pero no lo tome en consideración, grabe error:

m_pMesh = m_pMesh.Clone(m_pMesh.Options.Value, CustomVertex.PositionNormalTextured.Format, pD3DDevice);
m_pMesh.ComputeNormals();


Pues eso, hago un clon de la malla diciéndole que el bufer de vértices almacene la posición, la normal y las coordenadas de textura y después calculo las Normales y ¡viola! así queda la cosa.



Como podéis ver en la captura, en la pared del fondo, en la parte derecha de Batman y en algunos sitios mas, se puede apreciar que esta la textura mas oscura, y por el contrario en la parte que afecta a la luz se ve mas brillante. En esta captura, la luz se encuentra justo en las coordenadas de la cámara.

¡¡Dios!! que sensacion mas buena cuando te salen las cosas jejejeje :) y ahora a la cama que ya es hora y en seis horas otra vez en pie.

lunes, 20 de octubre de 2008

Sigo atascado con las luces...

Como podeis ver en el blog llevo mas de 20 dias atascado con el tema de agregar luces y sombras por shaders, bueno mas concretamente las luces solo de momento.
Debido a tener que utilizar Shader se me ha ocurrido cambiar un poco la estructura de clases de:

World.Draw
Rooms.Draw
Entities.Draw
Meshes.Draw(Entity)

a:
World.Draw
Rooms.Draw
Effects.Draw
Entities.Draw(Effect)
Meshes.Draw(Effect, Entity)


Asi consigo que el efecto que indique en el fichero de configuracion de la Room se aplique a todas y cada una de las entidades que apareceran en escena.

Además, he creado una clase EffectManager que se encargara de cargar los efectos indicados en el fichero de configuracion de Efectos y almacenarlos en un repositorio para que no se duplique la carga de estos en memoria.

Aun así y despues de esta nueva organización de clases, el Shader que me pinta la luz no lo hace del todo bien, podeis ver la web de referencia que estoy siguiendo:
Riemers

Ojala y me apareciera la escena como a él jejejeje...

viernes, 3 de octubre de 2008

Luces con Shaders

Ya he conseguido crear una luz con Shader pero el resultado no es lo que esperaba, ya que algunas zonas me desaparecen totalmente. Todavia no he conseguido entender del todo como funcionan estos Shaders pero aun asi he hecho una captura de pantalla para que podais apreciar esos fallos que os comento:

Como podeis ver en la imagen, la parte de atras de la puerta que esta mas cerca a nosotros ha desaparecido, las baldosas aparecen transparentes y algunas partes de la malla de Batman tambien han desaparecido (la parte de abajo de la capa, el cuello, etc...).

Creo que el fallo esta en que la posicion de la luz esta en coordenadas locales de cada malla y se aplica a cada malla mostrada en pantalla, tengo que conseguir aplicar la luz a nivel de habitacion en vez de a cada malla.

07/10/08:
Mis sospechas parecen erroneas, despues de mirar a fondo el Shader y multiplicar las coordenadas de la luz por la Matriz 'WorldViewProjection' para sacar la posicion de la luz en el mundo, la imagen parece que tampoco queda del todo bien.
Tengo que inventar algo para que pinte la posicion de la luz en pantalla y ver realmente lo que esta ocurriendo.
Pues nada a seguir intentandolo...

Resultado de la encuesta

Como resultado a la pregunta que puse hace un mes aproximadamente:

¿Que mejorarias del Batman original en este remake?

Los resultados son estos:

El 66% (o lo que es lo mismo 2 personas) dejaria el juego tal y como esta.
El otro 33% (1 persona) haria cambios que mejoraran la jugabilidad del tipo de movimiento de camaras, aspecto grafico u otras cosas.

Gracias por participar a las 2 personas que lo han hecho porque el tercero soy yo jejeje.
Agradeceria que pusierais un comentario para saber por lo menos quienes sois y daros las gracias personalmente, debeis ser las unicas personas que leen este blog :)