Bildsynthese
Bildbasierte Beleuchtung
Thorsten Thormählen
13. Juli 2023
Teil 3, Kapitel 4
Thorsten Thormählen
13. Juli 2023
Teil 3, Kapitel 4
Dies ist die Druck-Ansicht.
Weiterschalten der Folien durch die → Taste oder
durch das Klicken auf
den rechten Folienrand.
Das Weiterschalten der Folien kann ebenfalls durch das Klicken auf den rechten bzw. linken Folienrand erfolgen.
| 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$ |
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);
}
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));
}
Anregungen oder Verbesserungsvorschläge können auch gerne per E-Mail an mich gesendet werden: Kontakt