Hoy me dió por intentar algún método de sombreado. Tenía un tutorial bastante bueno sobre como hacer stencil shadows, pero cuando metí mano a la clase Mesh de Direct3DX, vi que iba a ser un poco latoso ir trabajando con sus vertexbuffers, haciendo lock y unlock para trastear con ellos y demás. Decidí dejarlo para otro día. Además, a todo el mundo parece gustarle explicar las cosas simplemente con su código y yo prefiero que alguien me explique qué es lo que está haciendo. El código puede ser muy obvio para su autor, pero no lo es tanto para los demás.
El caso es que decidí coger el proyecto 'ejemplo1' que había usado en los inicios del motor, para cargar una malla e intentar sombrearlo de alguna manera. Y por arte de magia la malla había desaparecido. Ántes funcionaba, lo juro, pero ahora solo se mostraba el más absoluto vacío. Por algún momento, eso me hizo recordar el exámen de paralelas. Tras los últimos días de exámenes no he dormido mucho que digamos o, al menos, no lo que suelo dormir normalmente. Y no conseguía ver el error, aunque sospechaba que sería de lo más absurdo. Después de un rato lo encontré: el objeto tenía una matriz de transformación a ceros, es decir, estaba escalado al 0% (microscópico, vamos). Resulta que en el constructor de la clase Node debería haber un miserable updateRelativeMatrix = true; para inicializar la matriz de forma correcta.
Tras esto, volví a mi intento inicial de poder de alguna manera proyectar una textura sobre una malla. El método se llama 'projective texturing' y es más viejo que maricastaña. Ántes de que a todos se nos pusiera el culo a jugar parchís con tanto shadowmap y stencil shadows, esto era la repera. Así que por lo menos tenía la eficiencia asegurada, y realmente es un método que se sigue usando y resulta muy versátil a la par que espectacular si se utiliza bien. Pero por más que busqué no conseguía encontrar documentación decente. Lo más que encontré es un documento con algo explicado en OpenGL.
Tras 30 minutos leyendo artículos que no condúcen a nada, me bajé un ejemplo del SDK de ATI y ¡oh! ¡sorpresa! entre tanta llamada y tanta línea de código no se entera ni el tate. Así que intenté hacer un simple render a textura bajo el coche, a un simple plano. Todo muy simple. Y resulta que me topé con otro bug acerca del alfa de los materiales, que curiosamente funcionaba bien sobre las partículas, pero no sobre un billboard suelto. Grrrr, se me empezaba a hinchar la vena de la frente en 3D.
Vale… respiré hondo e intenté dibujar un billboard en el que se vea solo lo negro y lo blanco se vuelva transparente (vamos, lo contrario de una modulación ADD). Bueno, hecho, no ha sido muy traumático. Ahora a por el gran final. Mmmm, otro mini-bug a la hora de gestionar mallas… ¡esto es un no parar señores! (menos mal que este era de los facilitos y con una pequeña traza todo resuelto). Un minutos más tarde ya estaba listo el render a textura, solo necesitaba que el coche se dibuje negro en vez de con su textura ¡y el color emisivo no funciona! Así que de golpe y sopetón, activé la iluminación y, al no haber luces, se renderizó en negro. Puff, menuda chapuza que quedó al final. Me parece que esto no ha sido una buena idea
Este es el resultado amigos:
Conclusión: Que para desperdiciar un render a textura en esta mierda más vale usar la típica sombra rectangular de toda la vida. Por lo menos me ha servido para depurar un par de bugs molestos. Y para darme cuenta de que realmente necesito dormir un poco.










