Rendering wolumetryczny - cz. II

20.12.2010 - Adam Błaszkiewicz
TrudnośćTrudnośćTrudność
Krok 10 - Korekcja kontrastu

Aby w pełni wykorzystać dostępny zakres kolorów, skalujemy każdą składową każdego koloru tak, aby najciemniejsza składowa spośród składowych wszystkich pikseli (z wyłączeniem tła, które jest całkowicie czarne) była ustawiona na 0, natomiast najjaśniejsza na 1. W tym celu najpierw szukamy najjaśniejszej i najciemniejszej składowej, a następnie, w drugim przejściu przez wszystkie piksele, skalujemy odpowiednio kolory wszystkich pikseli.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Szukamy najjaśniejszej i najciemniejszej składowej
double min = double.MaxValue;
double max = double.MinValue;
for (int y = 1; y < sizeY + 1; ++y)
{
    for (int x = 1; x < sizeX + 1; ++x)
    {
        Vector color = pixels[x, y].color;
        double currentMin = color.Min;
        double currentMax = color.Max;
 
        if (currentMax == 0)
            continue;
 
        min = Math.Min(min, currentMin);
        max = Math.Max(max, currentMax);
    }
}
 
// Wykonujemy skalowanie
double amplitude = max - min;
max -= whiteCut * amplitude;
min += blackCut * amplitude;
amplitude = max - min;
double amplitudeInv = 1 / amplitude;
for (int y = 1; y < sizeY + 1; ++y)
{
    for (int x = 1; x < sizeX + 1; ++x)
    {
        Vector color = pixels[x, y].color;
        color.x = (color.x - min) * amplitudeInv;
        color.y = (color.y - min) * amplitudeInv;
        color.z = (color.z - min) * amplitudeInv;
    }
    // (...)
}

5
Twoja ocena: Brak Ocena: 5 (2 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com