Actualmente estoy trabajando en un clon 2D "Worms" en XNA, y una de las características es el terreno "deformable" (por ejemplo, cuando un cohete golpea el terreno, hay una explosión y una parte del terreno desaparece).
Lo que estoy haciendo actualmente es mediante el uso de una textura que tiene un valor Rojo progresivamente más alto a medida que se acerca al centro. Recorro cada píxel de esa textura "Deformar", y si el píxel actual se superpone a un píxel del terreno y tiene un valor rojo lo suficientemente alto, modifico el conjunto de colores que representa el terreno a transparente. Si el píxel actual NO tiene un valor Rojo lo suficientemente alto, oscurezco el color del terreno (se vuelve más negro cuanto más se acerca el valor Rojo al umbral). Al final de esta operación, uso SetData para actualizar mi textura de terreno.
Me doy cuenta de que esta no es una buena manera de hacerlo, no solo porque he leído sobre los puestos de ductos y demás, sino también porque puede volverse bastante lento si se agregan muchos cráteres al mismo tiempo. Quiero rehacer mi generación de cráteres en la GPU en lugar de usar "Renderizar objetivos" entre ser el objetivo y la textura a modificar. Ese no es el problema, sé cómo hacerlo. El problema es que no sé cómo mantener mi efecto de quemado con este método.
Así es como se ve el efecto de quemado en este momento:
¿Alguien tiene una idea de cómo crearía un efecto de quemado similar (oscureciendo los bordes alrededor del cráter formado)? No estoy completamente familiarizado con Shaders, pero si lo requiere, estaría muy agradecido si alguien me explicara cómo hacerlo. Si hay otras formas, eso también sería genial.
Respuestas:
Una forma de hacerlo es similar a lo que ha estado haciendo. Tenga una textura de "Daño" y la textura de fondo real, pero en lugar de copiar los datos cada vez, simplemente mantenga los dos como dos texturas separadas.
Cuando se realiza una explosión, dibuja un círculo en la textura de Daño que tenga un borde ligeramente transparente. Esta será el área de "quemadura".
Siempre que dibujes el terreno, dale a la GPU ambas texturas y haz que tu sombreador multiplique el color (.rgb) de los píxeles de fondo por 1, el valor alfa de la textura de daño. Deshágase de los píxeles completamente negros (alfa a 0, o también puede multiplicar esto a alfa (.rgba en lugar de .rgb) dependiendo de si desea áreas translúcidas quemadas) y ¡listo!
Dudo que esta sea la mejor solución, pero es bastante similar a lo que has hecho antes, lo que puede facilitar la transferencia. Probablemente también podría salirse con la suya al pasar una matriz de Vector3 (x, y, radio) y hacer algunas matemáticas en el sombreador en función de esos puntos de explosión, pero no estoy seguro de la eficiencia de tales.
¡Espero que esto ayude!
fuente