Voy a crear este post aparte para tratar el tema de la iluminación con DirectX 9, esto es debido a la gran cantidad de factores a tener en cuenta para iluminar una escena. Listo a continuación los punto que tendré que solventar para llevar a buen puerto la iluminación en Telemakhos.
- Normales en la definición de los vértices.
- Materiales describiendo las propiedades de los objetos en la escena.
- Tipos de luces y sus propiedades.
- Limitaciones de la iluminación a nivel de vértices.
La normal de un triángulo define un vector que "sale" de la cara de ese triángulo que podrá ser vista. Puesto que la iluminación es a nivel de vértices, cada vértices de los 3 que componen un triángulo, contendrá una normal. El cálculo de la normal no es demasiado complejo y puede y debe hacerse en una etapa previa al renderizado. Bueno, el cálculo no sería necesario si el fichero desde el que importo el objeto ya contuviera las normales calculadas, pero en el caso del formato .X3D exportado por Blender, estas normales no están presentes, y no me queda más remedio que calcularlas yo mismo "a pelo".
![]() |
| Vector Normal |
Otro punto importante es que debido a que uso índices para referirme a los vértices compartidos por los polígonos, deberé calcular la normal combinada para vértices adyacentes, y esto que matemáticamente, no tiene mayor dificultad, puede generar resultados no deseados. Por ejemplo, cuando calcule la normal promediada de los vértices de un cubo, la resultante hará que la luz incida en el objeto de tal forma que suavizará las esquinas, dando la sensación de que el cubo esta algo redondeado, cosa que en casos como este del cubo, pueden suponer un problema. Por todo esto, tendré que tener 2 tipos de objetos en lo que a normales se refiere, uno donde use índices y las normales de vértices adyacentes se combinen, y otro donde no use índices y no se repitan vértices, de esta forma no habrá problemas con las esquinas redondeadas del cubo que comentaba anteriormente.
Materiales:
Los materiales definen como la luz afecta a los objetos. También define de forma indirecta qué color tiene cada objeto. Puesto que por ahora a nivel de materiales no quiero complicarme mucho la existencia, mi idea es definir un material "general" que se aplicará a todos los objetos de la escena, y el color general será una variante de blanco, esto será así porque pretendo aplicar texturas a los objetos de la escena y el color no me preocupa, tan solo debe asegurarme de que tenga igualadas las componentes RGB.
Tipos de luces:
Hay 3 tipos de luces: puntos de luz (point lights) p.e. una bombilla, luz focal (spot lights) p.e. una linterna y luces direccionales (directional lights) como podría ser el Sol. Cada uno lleva valores asociados que definen cada fuente de luz. Todos los tipos son interesantes e iré probándolos según los vaya necesitando.
Limitaciones:
Cada tarjeta sólo permite un número determinado de luces a la vez en la escena, este dato puede ser consultado desde DirectX y debe tenerse en cuenta.
El motor de iluminación de DirectX no genera sombras generadas por objetos interpuestos a las fuentes de luz. Cuando la naturaleza de esta luz es estática, es decir, a lo largo del tiempo no va a variar su posición, podríamos hacer un precalculo de como se verían afectados los objetos y modificar "a mano" las intensidades de los colores de esos objetos para que ya de por si aparentes estar sombreados. Aun falta mucho para esto... además que en Telemakhos no creo que necesite este tipo de sombreados.
Actualización: Hecho!
Aunque el resultado es bastante crute visualmente, me siento satisfecho. Las normales son prmediadas, el material utilizado es al más simple posible y la luz utilizada es direccional. El punto más complicado de la iluminación lo encontré en el cálculo de las normales.
Normales:
Blender exporta todas las caras como cuadrados (4 vértices), y para visualizarlas en DirectX tengo que separar cada una de estas caras en 2 mas simples de 3 vértices (triángulos). Esto, como comprové, conlleva al error en el cálculo de normales, puesto que se deben calcular para cada vértice teniendo en cuenta que pertenece a una cuádrupla de vértices y no a un triángulo. Asi que, a pesar de terminar las caras siendo todas triángulos tuve que calcular las normales para cada vértice perteneciente a un cuadrado, y asi promediarlas.
Actualización: Blender no solo exporta las caras como cuadrados, tambien las exporta como triángulos, incluso un mismo objeto puede tener ambos tipos de caras. Mis rutinas de lectura de ficheros .X3D ya contemplan esto.
Tambien me he dado cuenta que para realizar una escena compleja como las de los juegos actuales no basta con definir n luces dinámicas. También deberé definir luces estáticas, y esto se consigue modificando la componente difusa de color para determinadas caras de los objetos y así "simular" que estan siendo iluminadas por, por ejemplo, una farola cercana. Y pensando en Telemakhos, deberé definir una luz direccional para la luz de alguna estrella próxima, y luego, tal vez, alguna de otro tipo para misiles, explosiones o cosas por el estilo.
El siguiente paso serán las texturas.
Nota: aunque esta forma de trabajar es algo precipitada, puesto que estoy atajando resultados, una vez consiga bastante resultados me pondré a definir mejor el engine. Por ahora simplemente estoy viendo cómo hacer las cosas y probándolas.

No hay comentarios:
Publicar un comentario