Creo que debería pensar en el efecto como "calcular un mapa de dónde está el agua" + "generar un vector normal a partir de ese mapa y utilizarlo para compensar una búsqueda de textura de fondo".
Desglosando lo que hace su sombreador de ejemplo, solo calcula un "rastro" para mostrar dónde ocurre la desempañado:
Calcula las normales de las gotas de lluvia circulares,
y usa ese mapa normal para compensar una búsqueda de textura a una refracción falsa.
Si desea que los senderos se realicen mediante el procesamiento posterior en un sombreador, debe crear la forma de "rastro" en el sombreador utilizando algo de álgebra. Por ejemplo, en la siguiente función, he superpuesto un "camino tambaleante" y un cono en la cabeza y la cola para obtener
float trailDrop(vec2 uv, vec2 id, float t) {
// wobbly path
float wobble = 0.5 + 0.5
* cos(120.0 * uv.y)
* sin(50.0 * uv.y);
float v = 1.0 - 10.0 * abs(uv.x - 0.5 + 0.2 * wobble);
// head
v *= clamp(30.0 * uv.y, 0.0, 1.0);
v *= clamp( uv.y + 7.0 * t - 0.6, 0.0, 1.0);
// tail
v *= clamp(1.0 - uv.y - pow(t, 2.0), 0.0, 1.0);
return clamp(v * 10.0, 0.0, 1.0);
}
Aquí hay un POC aproximado en sombreado: https://www.shadertoy.com/view/XlBfz1 que demuestra cómo crear un conjunto de senderos de gotas de lluvia. Se ve granulado en resoluciones pequeñas debido a la resolución de los derivados, pero debería verse mejor si lo visualiza a pantalla completa.
Editar: se agregó un ejemplo con gotas de lluvia superpuestas
Dejado como ejercicio para el lector:
1) Agregue las pequeñas gotas redondas. para inspirarte, mira la StaticDrops
función en tu ejemplo de sombreado original.
2) Agregue cálculos normales de alta calidad. Como lo indica la #define CHEAP_NORMALS
opción en su ejemplo original de sombreado, el dFdx incorporado es una aproximación de baja fidelidad y puede obtener mejores resultados calculando manualmente las derivadas (a costa de calcular la función 3 veces).
3) Aleatorizar el espacio entre las columnas. Puede ampliar las columnas y luego modificar el uv.x - 0.5 + 0.2 * wobble
bit para agregar un desplazamiento aleatorio en el eje x. Probablemente también querrás sacar una página del ejemplo original una vez más y superponer un par de capas de flujos de diferentes tamaños una encima de la otra para obtener una apariencia menos uniforme.
Puede hacer este efecto siguiendo los pasos a continuación:
Partícula
RenderTextuer
puede almacenar el resultado utilizando RenderTexture. Este es un ejemplo de multipass en shadowrtoy:
https://www.shadertoy.com/view/ltccRl
Creé una cámara para renderizar partículas en RenderTexture:
GrabPassing
puedes obtener un pase para aplicar Distorsión
Lo expliqué en esta publicación:
¿Cómo puedo replicar el efecto de partícula de distorsión de Quantum Break?
Difuminar
Al usar alfa en color durante toda la vida, tenemos un desenfoque simple
para obtener un mejor resultado, es mejor usar desenfoque simple, pero ¿cómo logramos desenfoque?
Matriz de convolución
En el procesamiento de imágenes, un núcleo, matriz de convolución o máscara es una matriz pequeña. Se utiliza para desenfocar, enfocar, grabar, detectar bordes y más. Esto se logra haciendo una convolución entre un núcleo y una imagen.
para más detalles, siga este enlace
Caja de desenfoque
Repetición
puede usar Rendertexture para almacenar el fotograma anterior. para que pueda tomar el fotograma anterior y luego desenfocar. repitiendo esto logras desenfoque.
Normal
Conclusión
Shader final:
sin usar alfa en color durante toda la vida:
mediante el uso de alfa en color durante toda la vida:
La fuente está disponible:
https://github.com/smkplus/RainDrop
¡Hay más!
también puedes hacer ondas
Enlaces útiles
https://80.lv/articles/breakdown-animated-raindrop-material-in-ue4/
https://seblagarde.wordpress.com/2013/01/03/water-drop-2b-dynamic-rain-and-its-effects/
fuente
En realidad, hubo una pregunta sobre esto hace años, pero no pertenece a Unity en absoluto (desafortunadamente). Si observa la diapositiva 57 de la presentación vinculada, mencionan un enfoque basado en la cuadrícula.
Hay una pregunta algo relacionada sobre Física SE que puede encontrar interesante. El enlace a droplet.pdf en la pregunta vinculada está roto, pero todavía está en la máquina Wayback. Entra en algunas de las matemáticas del agua que se escurre de algunos tipos de superficies. Las gotas prefieren viajar en caminos utilizados anteriormente por gotas de lluvia anteriores, por ejemplo (ver p926).
Probablemente podría modelar las cabezas y las colas de cada "gota de lluvia" y permitirle zigzaguear un poco. Cuando dos gotas de lluvia alargadas chocan, supongo que podrías hacer que se combinen en una gota de lluvia más grande y de movimiento más rápido. El volumen de agua permanece igual. Simplemente está siendo movido y moldeado por las fuerzas de la gravedad, la adhesión al vidrio y la cohesión.
fuente