Computergrafik

Prozedurale Muster
Wiederholung: Rauschen (Noise)
Rauschen ist in der Computergrafik eine wesentliche Voraussetzung zur Darstellung von u.a.:
- Wolken
- Berge
- Lichteffekten
- und vielen weiteren Effekten in der Natur
Alle Bilder sind gemeinfrei
Motivation
Wie kommen wir vom Rauschen (Noise) zu komplexen prozeduralen Texturen?
Alle Bilder sind gemeinfrei

Value noise
🤔
?

Foto: Inigo Quilez
Sinus-Funktion
Frequenz
Amplitude
Überlagern von Sinusfunktionen
Live Demo
Rauschen statt Sinus

Wir nutzen noise() anstelle von sin()
Wir addieren Rauschmuster mit sukzessive (über mehrere Oktaven) variierenden Frequenzen und Amplituden:
- Frequenzen werden größer ⬆️
- Amplituden werden kleiner ⬇️
Fractial Brownian Motion





f*1.0
A*1.0
f*2.0
A*0.5
f*4.0
A*0.25
f*8.0
A*0.125
Fractial Brownian Motion (Code)
// Eigenschaften
const int octaves = 5;
float lacunarity = 2.0;
float gain = 0.5;
//
// Initiale Werte
float amplitude = 0.5;
float frequency = 1.0;
// Schleife über Oktaven
for (int i = 0; i < octaves; i++) {
y += amplitude * noise(frequency*x);
frequency *= lacunarity;
amplitude *= gain;
}= Anzahl Rausch-Ebenen
= "Lückenhaftigkeit"
= Verstärkungsfaktor
= Initiales Rausch-Muster
= Frequenz wird erhöht ⬆️
= Amplitude wird verringert ⬇️
⌨️ Von Value-Noise zu FBM


10 Min
⌨️ Von Value-Noise zu FBM
Live
coding
⌨️ Wolkenhimmel
Erweitern Sie Ihren Code dahingehend, dass sich die Wolken am Himmel bewegen.
10 Min

Beispiel
FBM-Adaptionen: Turbulences

Bild: Patricio Gonzalez Vivo

Simplex Noise



FBM
FBM-Adaptionen: Turbulences
// Eigenschaften
const int octaves = 5;
float lacunarity = 2.0;
float gain = 0.5;
//
// Initiale Werte
float amplitude = 0.5;
float frequency = 1.0;
// Schleife über Oktaven
for (int i = 0; i < octaves; i++) {
y += amplitude * abs(snoise(frequency*x));
frequency *= lacunarity;
amplitude *= gain;
}= absolute Werte
Bild: Patricio Gonzalez Vivo

= Simplex-Noise
= Ergebnis

⌨️ FBM: Turbulences
Live
coding
FBM-Adaptionen: Domain Warping
Bilder: Inigo Quiles



float dmWarping(vec2 p)
{
vec2 q = vec2( fbm( p + vec2(0.0,0.0) ),
fbm( p + vec2(5.2,1.3) ) );
vec2 r = vec2( fbm( p + 4.0*q + vec2(1.7,9.2) ),
fbm( p + 4.0*q + vec2(8.3,2.8) ) );
return fbm( p + 4.0*r );
}FBM-Adaptionen: Domain Warping
Bild: Inigo Quiles

Ausblick
Source code (Inigo Quilez): https://www.shadertoy.com/view/4ttSWf
✅ Zusammenfassung
- Komplexe Strukturen können nicht mit einfachem Rauschen modelliert werden
- Stattdessen kombinieren (+) wir Rauschen mit unterschiedlichen Parametern
(z.B. Frequenz, Amplitude)
➔ Fractional Brownian Motion (FBM)
- FBM dienen als Basis zur Modellierung komplexer prozeduraler Muster / Texturen



FBM
CG5 Prozedurale Muster und Fraktale
By blackbill
CG5 Prozedurale Muster und Fraktale
- 58