2012-01-25 18 views
5

Sto cercando di creare nuvole di disturbo Perlin super semplici in uno shader di frammenti, utilizzando la funzione di disturbo trovata here.Attenuazione del disturbo perlin di bassa ottava

Alle basse ottave la mia uscita è, per mancanza di una parola migliore, "blobby". Mi piacerebbe semplicemente appianare queste aree flaccide e avere un rumore regolare, ma è un po 'più dettagliato di una sola ottava.

Fragment Shader:

#ifdef GL_ES 
precision mediump float; 
#endif 

uniform float time; 
uniform vec2 resolution; 

// Noise related functions go here .. 

float surface3 (vec3 coord) { 
     float frequency = 4.0; 
     float n = 0.0; 

     n += 1.0 * abs(cnoise(coord * frequency)); 
     n += 0.5 * abs(cnoise(coord * frequency * 2.0)); 
     n += 0.25 * abs(cnoise(coord * frequency * 4.0)); 

     return n; 
} 

void main(void) { 
     vec2 position = gl_FragCoord.xy/resolution.xy; 

     float n = surface3(vec3(position, time * 0.1)); 

     gl_FragColor = vec4(n, n, n, 1.0); 
} 

esempio dal vivo:
http://glsl.heroku.com/e#1413.0

sinistra è quello che ho in questo momento. Come potrei ottenere qualcosa di più in linea con l'immagine giusta?

risposta

4

Il modo più semplice è eliminare due delle chiamate di rumore nella funzione di superficie. Lasciare solo la prima linea di chiamata rumore e si ottiene qualcosa che sembra come il primo:

http://glsl.heroku.com/e#1450.0

Le forti linee nel rumore multi-ottava provengono da utilizzando abs(), rimuovere l'abs() e sostituire con quadratura del valore del rumore o facendo qualcosa come 0.5 * (1.0 + cnoise()) (se l'uscita cnoise è compresa tra -1..1).

Ecco il risultato di alcuni giocherellare http://glsl.heroku.com/e#1450.1

+0

Grazie Ilmari. Ho preso in considerazione la tua soluzione e ho usato solo un'ottava di rumore, ma il risultato sembra ancora piuttosto sbiadito. Inoltre, non mi piace troppo il maggior contrasto tra aree bianche e nere. La mia comprensione è stata che aggiungere ulteriori ottave di rumore aggiunge dettagli ma riduce anche il contrasto nel risultato (basato su http://libnoise.sourceforge.net/tutorials/tutorial4.html#octaves) che è esattamente quello che sto cercando. Sono ragionevole? –

+0

Ah, va bene, capisco cosa intendi ora. Modificato la risposta. –

+0

Bello, questo ha fatto il trucco - grazie! –