Sto cercando di creare un effetto scintillante per il mio shader in tempo reale, ma non so come.
Ecco un esempio e un altro esempio .
Quale tecnica posso usare per implementare questo?
Sto cercando di creare un effetto scintillante per il mio shader in tempo reale, ma non so come.
Ecco un esempio e un altro esempio .
Quale tecnica posso usare per implementare questo?
Risposte:
Bene, quando ci viene chiesto di progettare uno shader, dovremmo iniziare suddividendo le cose in piccoli problemi. E proprio come nota l'effetto scintillante in realtà non rende lo shader bello, ma l'illuminazione generale e l'effetto, usando solo uno di essi, non saranno altrettanto belli.
Innanzitutto diciamo cosa non fa direttamente parte dello shader:
In secondo luogo, suddividiamo lo shader reale in effetti separati:
Si noti che tali tessuti hanno infiniti molti normali, ma la tecnica qui descritta si avvicina al normale più significativo
Al fine di approssimare il più significativo normale, un modo per farlo è quella di utilizzare tessitura coordinate e tangenti Calcola della maglia, e invece di calcolare N . L si calcola 1- (NT).
Spiegazione completa qui . E probabilmente dovrai implementarlo nello shader di frammenti piuttosto che nella tecnica di vertice di cui parlano. Possono essere applicati anche altri modelli anisotropi.
Ora per l'effetto scintillante:
Questo può essere fatto nello spazio mondo / spazio trama locale o spazio schermo come passaggio separato.
L'algoritmo a cui riesco a pensare, usa la tecnica di elaborazione delle immagini (supponendo che la mesh abbia dei bordi di trama).
Si noti che l'immagine sopra è solo un esempio del filtro massimo e applicandolo sul rumore si otterrà un valore simile a un campo stellare.
Esempio di filtro gausiano applicato sul rumore massimo (ed).
Nota, questa tecnica potrebbe richiedere un'ottimizzazione significativa per uno shader in tempo reale.
C'è un interessante articolo AMD - Getting Procedural .
Sembra che le scintille siano più difficili di quanto penso.
Soluzione decente: usa la posizione 3D per indicizzare la funzione del rumore 3D, aggiungi il vettore della vista, usa la funzione frac per randomizzare ulteriormente le cose.
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);