Steuerungstasten

nächste Folie (auch Enter oder Spacebar).
vorherige Folie
 d  schaltet das Zeichnen auf Folien ein/aus
 p  wechselt zwischen Druck- und Präsentationsansicht
CTRL  +  vergrößert die Folien
CTRL  -  verkleinert die Folien
CTRL  0  setzt die Größenänderung zurück

Das Weiterschalten der Folien kann ebenfalls durch das Klicken auf den rechten bzw. linken Folienrand erfolgen.

Notation

Typ Schriftart Beispiele
Variablen (Skalare) kursiv $a, b, x, y$
Funktionen aufrecht $\mathrm{f}, \mathrm{g}(x), \mathrm{max}(x)$
Vektoren fett, Elemente zeilenweise $\mathbf{a}, \mathbf{b}= \begin{pmatrix}x\\y\end{pmatrix} = (x, y)^\top,$ $\mathbf{B}=(x, y, z)^\top$
Matrizen Schreibmaschine $\mathtt{A}, \mathtt{B}= \begin{bmatrix}a & b\\c & d\end{bmatrix}$
Mengen kalligrafisch $\mathcal{A}, \{a, b\} \in \mathcal{B}$
Zahlenbereiche, Koordinatenräume doppelt gestrichen $\mathbb{N}, \mathbb{Z}, \mathbb{R}^2, \mathbb{R}^3$

Bildbasierte Beleuchtung

  • Bei der bildbasierten Beleuchtung (engl. "Image-based Lighting") wird die emittierte Strahldichte $L_i$ der Umgebung durch ein sphärische Umgebungsbild (engl. "Environment Map") angegeben
envmap
$s$
$t$
$0.0$
$1.0$
$1.0$
$0.0$
$0.0$
$\pi$
$\pi$
$0.0$
$-\pi$
$\theta$
$\phi$
Quelle: : HDR Umgebungsbild von HDRI Haven, CC0

Environment Map

spherical_coord
$y$
$x$
$z$
$\mathbf{p}$
$\phi$
$\theta$
  • Zusammenhang zwischen Texturkoordinaten $(s, t)$ und Kugelkoordinaten $(\phi, \theta):$
    $\begin{align} s &= 0.5 - \frac{\phi}{2\pi} \\ &= 0.5 - \frac{1}{2\pi} \operatorname{arctan2}(y, x)\\ t &= 1.0 - \frac{1}{\pi} \theta \\ &= 1.0 - \frac{1}{\pi} \arccos(z) = \frac{1}{\pi} \arccos(-z) \end{align}$
  • Beispiel: Envmap
    vec2 directionToSphericalEnvmap(vec3 dir) {
      float s = 0.5 - atan(dir.y, dir.x) / (2.0 * PI);
      float t = 1.0 / (PI) * acos(-dir.z);
      return vec2(s, t);
    }

Wiederholung: Importance Sampling

  • Mit Importance Sampling kann jedes Integral auch durch folgende Summe approximiert werden:
    $\int\limits_a^b \mathrm{f}(x) \,dx \approx \frac{1}{N} \sum\limits_{n=1}^{N} \frac{\mathrm{f}(x_n)}{\mathrm{p}(x_n)}$
    Dabei ist $\mathrm{p}(x)$ eine beliebige Wahrscheinlichkeitsdichtefunktion (WDF), die folgende Bedingung erfüllen muss
    $\int\limits_a^b \mathrm{p}(x) \, dx = 1$
  • Theoretisch wäre das beste WDF (mit dem geringsten Fehler der Approximation)
    $\mathrm{p}(x) = \frac{\mathrm{f}(x)}{ \int_a^b \mathrm{f}(x)}$
    was bedeutet, dass die WDF der Form der Funktion folgen sollte (d.h. die Dichte sollte höher sein, wenn die Funktionswerte höher sind).

Wiederholung: Inversionsmethode

  • Die Wahrscheinlichkeitsdichtefunktion (WDF) $\mathrm{p}(x)$ kann beliebig gewählt werden
  • Um ein möglichst gutes Ergebnis nach wenig Abtastwerten zu bekommen, sollte die WDF der Form der Funktion folgen
  • Aber wie können Abtastpositionen mit einer bestimmten WDF generiert werden?
    • In vielen Programmiersprachen stellen Funktionen bereit, um gleichverteilte Zufallszahlen zu erzeugen
    • Mit der Inversionsmethode ist es möglich, aus gleichverteilten Werten Zufallszahlen mit anderen WDF zu erzeugen
  • Inversionsmethode
    • Berechne die Verteilungsfunktion
      $\mathrm{P}_x(x) = \int\limits_{-\infty}^x \mathrm{p}(\tilde{x}) \,d\tilde{x}$
    • Erzeuge gleichverteile Zufallswerte $u \in [0, 1]$
    • Berechne Zufallszahlen $x$ gemäß $\mathrm{p}(x)$ mit der Inversen der Verteilungsfunktion
      $x = \mathrm{P}^{-1}_x(u)$

Inversionsmethode bei einer 2D Wahrscheinlichkeitsdichte

  • Die Inversionsmethode kann auch bei einer zweidimensionalen WDF Funktion $\mathrm{p}(x, y)$ angewendet werden
  • Dazu zunächst die Randdichte für eine Dimension berechnen, z.B. für $x$:
    $\mathrm{p}(x) = \int \mathrm{p}(x, y) \,dy$
  • Wird $x$ gemäß dieser WDF erzeugt, ergibt sich für die bedingte Wahrscheinlichkeit von $y$
    $\mathrm{p}(y | x) = \frac{\mathrm{p}(x, y)}{\mathrm{p}(x)}$
  • Nun die bekannte Inversionsmethode jeweils für die zwei WDFs $\mathrm{p}(x)$ und $\mathrm{p}(y | x)$ anwenden
  • Alternativ können natürlich auch $\mathrm{p}(y)$ und $\mathrm{p}(x | y)$ verwendet werden

Transformation von Wahrscheinlichkeitsdichten

  • Wird eine mehrdimensionale Zufallsvariable $\mathbf{x} = (x_1, x_2, \dots, x_n)^\top$ mit einer mehrdimensionalen bijektiven (=eineindeutigen) Funktion
    $\mathbf{y} = \mathrm{f}(\mathbf{x}) = (\mathrm{f}_1(\mathbf{x}), \mathrm{f}_2(\mathbf{x}), \dots, \mathrm{f}_n(\mathbf{x}))^\top$
    abgebildet, so gilt für die WDF
    $\mathrm{p}(\mathbf{y}) = \frac{1}{|\mathtt{J}_f(\mathbf{x})|} \mathrm{p}(\mathbf{x})$
    dabei ist $|\mathtt{J}_f(\mathbf{x})|$ die Determinate der Jacobi-Matrix
    $\mathtt{J}_f(\mathbf{x}) = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \dots & \frac{\partial f_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x_1} & \dots & \frac{\partial f_n}{\partial x_n} \end{bmatrix}$

Importance Sampling einer Environment Map

  • Das Umgebungsbild wird in ein Grauwertbild $\mathrm{g}(s, t)$ umgewandelt
  • Die Parametrisierung des Bilds erfolgt in Texturkoordinaten $(s, t) \in [0, 1]$
  • Das Bild hat $S \times T$ Pixel und eckige Klammern $\mathrm{g}[x, y]$ bedeuten Zugriff auf das jeweilige Pixel
  • Das Integral über das gesamte Grauwertbild ist:
    $I = \int\limits_{s \in [0, 1]} \int\limits_{t \in [0, 1]} \mathrm{g}(s, t) \,ds \, dt \approx \sum\limits_{x=0}^{S-1} \sum\limits_{y=0}^{T-1} \mathrm{g}[x, y] \underbrace{\Delta s}_{\frac{1}{S}} \underbrace{\Delta t}_{\frac{1}{T}} = \underbrace{\frac{1}{S\,T}\sum\limits_{x=0}^{S-1} \sum\limits_{y=0}^{T-1} \mathrm{g}[x,y]}_{\tiny \mbox{vorberechneter Mittelwert}}$
  • Damit gilt für die 2D Wahrscheinlichkeitsdichte
    $\mathrm{p}(s, t) = \frac{\mathrm{g}(s, t)}{I}$

Importance Sampling einer Environment Map

  • Die Randdichte bezüglich $t$ berechnet sich zu
    $\mathrm{p}_t(t) = \int\limits_{s \in [0, 1]} \mathrm{p}(s, t) \,ds \approx \mathrm{p}_t[y] = \frac{1}{I} \underbrace{\frac{1}{S}\sum\limits_{x=0}^{S-1} \mathrm{g}[x, y]}_{\tiny \mbox{vorberechnete Zeilenmittelwerte}}$
  • Die zugehörige Verteilungsfunktion lautet
    $\mathrm{P}_t(x) = \int\limits_{0}^x \mathrm{p}_t(x) \,dx \approx \frac{1}{T}\sum\limits_{y=0}^Y\mathrm{p}_t[y]$
  • Die Verteilungsfunktion kann nicht invertiert werden, da folgende Funktion nicht nach der gleichverteilten Zufallsvariable $u \in [0, 1]$ aufgelöst werden kann
    $u = \frac{1}{T}\sum\limits_{y=0}^Y\mathrm{p}_t[y]$
    Daher wird im Shader über $y$ gelaufen bis $u$ erreicht ist. Das zugehörige $Y$ ist die Bildzeile, in der der Abtastwert genommen wird

Importance Sampling einer Environment Map

  • Nachdem nun die Bildzeile $Y$ des Abtastwerts feststeht, muss mittels der bedingten Wahrscheinlichkeit $\mathrm{p}_s(s|t)$ die Bildspalte gefunden werden
  • Die bedingte Wahrscheinlichkeit lautet:
    $\mathrm{p}_s(s|t) = \frac{\mathrm{p}(s, t)}{\mathrm{p}_t(t)} \approx \mathrm{p}_s[x] = \frac{\mathrm{g}[x, Y]}{\frac{1}{S}\sum\limits_{x=0}^{S-1} \mathrm{g}[x, Y]} $
  • Die zugehörige Verteilungsfunktion lautet
    $\mathrm{P}_s(x) = \int\limits_{0}^x \mathrm{p}_s(x)\,dx \approx \frac{1}{S}\sum\limits_{x=0}^X\mathrm{p}_s[x]$
  • Auch diese Verteilungsfunktion kann nicht invertiert werden, da die Funktion nicht nach der gleichverteilten Zufallsvariable $v \in [0, 1]$ aufgelöst werden kann
    $v = \frac{1}{S}\sum\limits_{x=0}^X\mathrm{p}_s[x]$
    Daher wird im Shader über $x$ gelaufen bis $v$ erreicht ist. Das zugehörige $X$ ist die gesuchte Bildspalte für den Abtastpunkt

Beispiel: Sampling einer Environment Map in GLSL

iblsample

Beispiel: Sampling einer Environment Map in GLSL

vec2 sampleEnvmap(sampler2D envmap, sampler2D rowAvg, 
        float totalAvg, vec2 random) {

  ivec2 texSize = textureSize(rowAvg, 0);
  float sumY = 0.0;
  float prevSumY = 0.0;
  float ra = 1.0;
  int y = 0;
  for(y = 0; y < texSize.y; y++) {
    ra = texelFetch(rowAvg, ivec2(0, y), 0).r;
    float pt = ra / totalAvg;
    sumY += pt / float(texSize.y);
    if(sumY >= random.y) {
      break;
    }
    prevSumY = sumY;
  }
  float subPixelY = (random.y - prevSumY) / (sumY - prevSumY);

  ivec2 envSize = textureSize(envmap, 0);
  float sumX = 0.0;
  float prevSumX = 0.0;
  int xx = 0;
  for(xx= 0; xx < envSize.x; xx++) {
    vec3 rgb = pow(texelFetch(envmap, ivec2(xx, y), 0).rgb, vec3(2.2));
    float gray = dot(vec3(0.2989, 0.5866, 0.1145), rgb);
    float ps = gray / ra;
    sumX += ps / float(envSize.x);
    if(sumX >= random.x) {
      break;
    }
    prevSumX = sumX;
  }
  float subPixelX = (random.x - prevSumX) / (sumX - prevSumX);

  return vec2((float(xx) + subPixelX) / float(envSize.x), 
              (float(y) + subPixelY) / float(texSize.y));
}

Bildbasierte Beleuchtung

  • Für die Anwendung bei der Rendering-Gleichung ergibt sich:
    $\begin{align}L_o(\mathbf{v}) &= L_e(\mathbf{v}) + \int\limits_\Omega \mathrm{f}_r(\mathbf{v}, \mathbf{l})\, L_i(\mathbf{l}) \cos(\theta) \, d\omega\\ &= L_e(\mathbf{v}) + \int\limits_{0}^{2\pi}\, \int\limits_{0}^{\pi/2}\underbrace{ \mathrm{f}_r(\mathbf{v}, \mathbf{l})\,L_i(\mathbf{l}) \cos(\theta) \sin(\theta)}_{\mathrm{f}(\theta_n, \phi_n)} \, d\theta \, d\phi\\ &\approx L_e(\mathbf{v}) + \frac{1}{N} \sum_{n=1}^{N} \frac{\mathrm{f}(\theta_n, \phi_n)}{\mathrm{p}(\theta_n, \phi_n)} \end{align}$
  • Da nur $\mathrm{p}(s, t)$ bekannt ist und nicht $\mathrm{p}(\theta, \phi)$ wird noch ein Umrechnung benötigt

Bildbasierte Beleuchtung

  • Zusammenhang zwischen Texturkoordinaten $(s, t)$ und Kugelkoordinaten $(\phi, \theta):$
    $\begin{align} \phi &= 2\pi \, (0.5 - s)\\ \theta &= \pi \, (1.0 - t) \end{align} $
  • Die Jacobi-Matrix lautet:
    $\mathtt{J} = \begin{bmatrix} \frac{\partial \phi}{\partial s} & \frac{\partial \phi}{\partial t} \\ \frac{\partial\theta}{\partial s} & \frac{\partial \theta}{\partial t} \end{bmatrix} = \begin{bmatrix} -2\pi & 0\\ 0 & -\pi \end{bmatrix} $
  • Die Determinate der Jacobi-Matrix ist demnach: $|\mathtt{J}| = 2 \pi^2$
  • Einsetzen in die Rendering-Gleichung:
    $\begin{align}L_o(\mathbf{v}) &= L_e(\mathbf{v}) + \int\limits_{0}^{2\pi}\, \int\limits_{0}^{\pi/2}\underbrace{ \mathrm{f}_r(\mathbf{v}, \mathbf{l})\,L_i(\mathbf{l}) \cos(\theta) \sin(\theta)}_{\mathrm{f}(\theta_n, \phi_n)} \, d\theta \, d\phi\\ &\approx L_e(\mathbf{v}) + \frac{1}{N} \sum_{n=1}^{N} \frac{\mathrm{f}(\theta_n, \phi_n)}{\mathrm{p}(s_n, t_n)} 2 \pi^2 \end{align}$

Beispiel: Bildbasierte Beleuchtung

ibl
  • Beispiel: IBL

Gibt es Fragen?

questions

Anregungen oder Verbesserungsvorschläge können auch gerne per E-Mail an mich gesendet werden: Kontakt

Weitere Vorlesungsfolien

Folien auf Englisch (Slides in English)