Novedades del Blog

miércoles, 26 de noviembre de 2008

Shadow Mapping is OK!!!!!



Después de mas de 2 meses de curro y de pegarme con el motor una y otra vez, ya he conseguido implementar el Shadow Mapping de una vez, ha sido una tarea dura pero ha merecido la pena.
Durante este tiempo además he aprovechado a hacer algunos cambios en los ficheros de configuración permitiendo que se pueda elegir la posición que ocupara la cámara y tres luces en cada habitación, además de otros parámetros independientes en cada luz, de momento no he hecho muchas pruebas pero el resultado es bastante majo.
Lo malo de todo esto es la considerable caída del framerate que se queda en unos 30 frs/seg, un poco justo para mi gusto, de todas maneras probare en distintas maquinas a ver que tal resultado, aun así, intentare optimizar al máximo.

Aquí pongo un vídeo para que se vea mejor el efecto de la sombra:

martes, 18 de noviembre de 2008

Resumen de Shaders

Llevo más de 2 meses desde que empece con los Shaders (exactamente el 10/09), pero en este tiempo de pegarme con los Shaders, el codigo ha cambiado infinidad de veces para intentar acoplar lo mejor posible estos Shaders y el codigo en C# con DirectX. Ahora mismo ya me funciona el agregar una luz con sus sombras con Shaders y estoy intentando hacer unos pequeños cambios en el codigo para poder usar por lo menos 3 luces a la vez en la escena.

Espero que para antes del tercer aniversario mensual :) esta parte de Luces y sombras con Shaders este acabada.

lunes, 10 de noviembre de 2008

Mas modificaciones...

Con las ultimas modificaciones que implemente, empece a ver pequeñas cosas que no me cuadraban mucho con lo que queria conseguir, asi que, lo que parecia un pequeño cambio se ha convertido en un gran cambio en la parte del juego. Cuando termine todas estas modificaciones pondre una nueva entrada intentando explicar un poco todos estos cambios.

Eso me esta llevando mucho tiempo, ademas de un factor externo llamado Gears of War 2 que lleva desde el viernes pasado atormentandome y no dejandome codificar tan rapido como me gustaria :D jejeje...

Tengo un gran conflicto interno :)

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...