Je pense que vous devriez penser à l'effet comme "calculer une carte de l'endroit où se trouve l'eau" + "générer un vecteur normal à partir de cette carte et l'utiliser pour compenser une recherche de texture d'arrière-plan".
En décomposant ce que fait votre exemple de shadertoy, il calcule simplement une "trace" pour montrer où le désembuage se produit:
Calcule les normales des gouttes de pluie circulaires,
et utilise cette carte normale pour compenser une recherche de texture pour une fausse réfraction.
Si vous voulez que les traces soient effectuées via le post-traitement dans un shader, vous devez simplement créer la forme "trail" dans le shader en utilisant une algèbre. Par exemple, dans la fonction suivante, j'ai superposé un "chemin bancal" et un cône à la tête et à la queue pour obtenir
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);
}
Voici un POC approximatif dans shadertoy - https://www.shadertoy.com/view/XlBfz1 démontrant la création d'un ensemble de traînées de gouttes de pluie. Il semble granuleux à de petites résolutions en raison de la résolution des dérivés, mais devrait mieux paraître si vous le faites en plein écran.
Edit: Ajout d'un exemple avec des gouttes de pluie superposées
Laissé en exercice au lecteur:
1) Ajoutez les petites gouttes rondes. pour l'inspiration, regardez leStaticDrops
fonction dans votre exemple original de shadertoy.
2) Ajoutez des calculs normaux de haute qualité. Comme le#define CHEAP_NORMALS
option de votre exemple original de shadertoy l'indique, le dFdx intégré est une approximation basse fidélité et vous pouvez obtenir de meilleurs résultats en calculant manuellement les dérivées (au prix du calcul de la fonction 3 fois).
3) Randomiser l'espacement entre les colonnes. Vous pouvez élargir les colonnes puis modifier le uv.x - 0.5 + 0.2 * wobble
bit pour ajouter un décalage aléatoire sur l'axe x. Vous souhaiterez probablement également retirer une page de l'exemple d'origine et superposer plusieurs couches de flux de tailles différentes les unes sur les autres pour obtenir un aspect moins uniforme.
vous pouvez créer cet effet en suivant les étapes ci-dessous:
Particule
RenderTextuer
vous pouvez stocker le résultat en utilisant RenderTexture. c'est un exemple de multipass dans shadertoy:
https://www.shadertoy.com/view/ltccRl
J'ai créé une caméra pour rendre des particules à RenderTexture:
GrabPassing
vous pouvez saisir un laissez-passer pour appliquer la distorsion
Je l'ai expliqué dans ce post:
Comment reproduire l'effet de particules de distorsion de Quantum Break?
Brouiller
en utilisant alpha en couleur sur la durée de vie, nous avons un simple flou
pour obtenir de meilleurs résultats, il est préférable d'utiliser un flou simple, mais comment obtenir un flou?
Matrice de convolution
Dans le traitement d'image, un noyau, une matrice de convolution ou un masque est une petite matrice. Il est utilisé pour le flou, la netteté, le gaufrage, la détection des bords, etc. Ceci est accompli en faisant une convolution entre un noyau et une image.
pour plus de détails, veuillez suivre ce lien
Boxblur
Répétition
vous pouvez utiliser Rendertexture pour stocker l'image précédente. vous pouvez donc saisir l'image précédente, puis la rendre floue. en répétant cela, vous obtenez un flou.
Ordinaire
Conclusion
Shader final:
sans utiliser alpha en couleur sur la durée de vie:
en utilisant alpha en couleur sur la durée de vie:
La source est disponible:
https://github.com/smkplus/RainDrop
Il y a plus!
vous pouvez aussi faire des ondulations
Liens utiles
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/
la source
Il y avait en fait une question à ce sujet il y a quelques années, mais elle ne concerne pas du tout (malheureusement). Si vous regardez la diapositive 57 de la présentation liée, ils mentionnent une approche basée sur une grille.
Il y a une question quelque peu connexe sur Physics SE qui pourrait vous intéresser. Le lien vers droplet.pdf dans la question liée est rompu, mais il est toujours sur la Wayback Machine. Il entre dans certaines des mathématiques de l'eau s'écoulant sur quelques types de surfaces. Les gouttelettes préfèrent se déplacer dans les chemins précédemment utilisés par les gouttes de pluie précédentes, par exemple (voir p926).
Vous pourriez probablement modéliser les têtes et les queues de chaque "goutte de pluie" et lui permettre de zigzaguer et de zaguer un peu. Lorsque deux gouttes de pluie allongées entrent en collision, je suppose que vous pourriez les combiner en une goutte de pluie plus grande et plus rapide. Le volume d'eau reste le même. Il est simplement déplacé et façonné par les forces de gravité, l'adhésion au verre et la cohésion.
la source