Sombras en Blitz3d

Uno de los tantos temas debatidos con Blitz3d es que carece de un sistema de sombras que sea fácil de implementar por parte del usuario novel. Si bien es cierto que otros sistemas de desarrollo traen un botón o permiten el uso de funciones prefabricadas para alcanzar este objetivo, en Blitz3d es imposible hacer esto tratando de evadir el hecho que el sistema debe ser implementado desde cero mediante escritura de código.

Claro esta que puede adquirir lib externas, pero la verdad lo que se trata es de que aprendamos a desarrollarlas nosotros mismos.

Existen dos tipos de sombras, unas llamadas volumetricas y otras llamadas cartográficas, yo por ahora explicaré cómo hacer las cartográficas, iniciativa que tome debido a varios usuarios que me escribieron respecto a la duda.

En teoría los elementos que intervienen en una sombra cartográfica son dos cámaras, una que visualiza el mundo desde la perspectiva del jugador y otra que hace de foco de luz, la que hace de foco, el contenido que visualiza lo dibuja en buffer de la textura usada para trabajo esa sombra.

Código:

Graphics3d 800,600,32,0.

Setbuffer backbuffer().

Global xscale#=1*(.8/3).

Global sombra = createtexture (256,256,16+32).
===============================
Ambientlight 64,64,64.

Global cámara = createcamera ().

Global terreno = createcube ().

Global sol = createlight().

Positionentity cámara, 0,6,-12.

Scaleentity terreno, 50,1,50.

Rotateentity sol, 90,0,0.

Global cubo = createcube ().

Positionentity cubo,0,4,0.

Entitycolor cubo,255,0,0.
==================================
Global s_cámara = createcamera ().

Cameraviewport s_camara,0,0,256,256.

Cameraprojmode s_camara,2.

Camerazom s_camara.3.

Positionentity s_camara,0,200,0.

Hideentity s_camara.

Entitytexture terreno,sombra.

Repeat tturnentity cubo,1.1,0 tpointentity s_camara,cubo tactualizar() trenderworld t tflip t.

Until keyhit(1).

End.

Function actualizar() tsetbuffer texturebuffer(sombra) tcolor 255,255,255 trect 0,0,texturewidth(sombra)+1,textureheight(sombra)+1 tsetbuffer backbuffer() tshowentity s_camara thideentity cámara tentitycolor cubo,64,64,64 tentityfx cubo,1+8 t trenderworld() tcopyrect 0,0,256,256,0,0,backbuffer(),texturebuffer(sombra) tentitycolor cubo,255,0,0 tentityfx cubo,0 t tfor s=1 todo countsurfaces(terreno) surf=getsurface (terreno, s) for v=0 todo countvértices(surf)-1 tformpoint vertexx(surf),vertexy(surf),vertexz(surf),terreno,s_camara vertextexcords surf, (tformedx()/xscale#)/32+0.5,1-((tformedy()/xscale#)/32+.5) next tnext t t t thideentity s_camara tshowentity cámara t t.

End function.


.

Espero esto sea de utilidad. Un saludo.

Ver más sobre el tema y los comentarios en el foro