Compartiré mi método para aplicar un efecto de iluminación suave a una cuadrícula de mosaico 2D. ClassicThunder's answer proporciona un buen enlace para las sombras.
En primer lugar, tendremos que calcular los valores de iluminación de cada mosaico que se difuminarán más tarde. Déjame ilustrar cómo funciona esto antes de entrar en el código.
Básicamente lo que hacemos es recorrer todos los azulejos, a partir de la parte superior, si un azulejo está en blanco, establezca la variable CurrentLight
al brillo máximo, si nos encontramos con un azulejo sólido, establecerla como CurrentLight
variable y reste una cantidad de "absorción" del CurrentLight
. De esta manera, en nuestra siguiente ficha sólida, cuando establecemos la ficha en el valor CurrentLight
, será un poco menor. Este proceso se repite hasta que la matriz se itera.
Ahora habrá un agradable efecto de iluminación de arriba hacia abajo, pero no es tan bueno. Debemos repetir este proceso 3 veces más, de abajo hacia arriba, de izquierda a derecha y de derecha a izquierda. Y puede repetirse más veces para una mejor calidad.
corriendo Básicamente este código en cada azulejo en el bucle
if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light
CurrentLightR = tile.Light;
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light
tile.Light = CurLightR;
if (tile.Light == CurLightR) //If it is the same, subtract absorb values
CurrentLight -= tile.Absorb;
y hay que ir, iluminación agradable azulejo. Sin embargo, si desea un aspecto menos "pixelizado", puede consultar mi question on gamedev para eso.
-1 En 4.0 bajo el comportamiento predeterminado (Color * float) no altera el brillo/oscuridad, altera la transparencia. http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4-0.aspx – ClassicThunder
@ClassicThunder ¿hay alguna forma de evitarlo? suena como la mejor manera – Neomex