J'essaie de créer un effet scintillant pour mon shader en temps réel mais je ne sais pas comment.
Voici un exemple et un autre exemple .
Quelle technique puis-je utiliser pour implémenter cela?
J'essaie de créer un effet scintillant pour mon shader en temps réel mais je ne sais pas comment.
Voici un exemple et un autre exemple .
Quelle technique puis-je utiliser pour implémenter cela?
Réponses:
Eh bien, lorsqu'on nous demande de concevoir un shader, nous devons commencer par décomposer les choses en petits problèmes. Et tout comme il est à noter que l'effet scintillant ne rend pas le shader vraiment bon, mais l'éclairage et l'effet global, en utilisant un seul d'entre eux, ne seront pas aussi bons.
Tout d'abord, disons ce qui ne fait pas directement partie du shader:
Deuxièmement, décomposons le shader réel en effets séparés:
Notez que ces tissus ont une infinité de normales, mais la technique décrite ici se rapproche de la normale la plus significative
Afin de rapprocher le plus important normale, une façon de faire, est d'utiliser les coordonnées de texture et de calculer tangentes du maillage, et au lieu de calculer N . L vous calculez 1- (NT).
Explication complète ici . Et vous devez probablement implémenter cela dans le shader de fragments plutôt que la technique de sommet dont ils parlent. D'autres modèles anisotropes peuvent également s'appliquer.
Maintenant pour l'effet scintillant:
Cela peut être fait dans l'espace du monde / l'espace de texture local ou l'espace d'écran comme un passage séparé.
L'algorithme auquel je peux penser utilise une technique de traitement d'image (en supposant que le maillage a des coords de texture).
Notez que l'image ci-dessus n'est qu'un exemple du filtre max, et l'appliquer sur le bruit donnera quelque chose de similaire à un champ d'étoiles.
Exemple de filtre Gausian appliqué sur le bruit max (ed).
Notez que cette technique peut nécessiter une optimisation importante pour un shader en temps réel.
Il y a un article intéressant AMD - Getting Procedural .
Il semble que les étincelles soient plus difficiles que je ne le pense.
Solution décente: utilisez la position 3D pour indexer la fonction de bruit 3D, ajoutez le vecteur de vue, utilisez la fonction frac pour randomiser davantage les choses.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);