Uczę się o normalnym mapowaniu. Zrozumiałem, że wartości RGB są konwertowane na XYZ, ale moje pytanie brzmi: w jaki sposób jest konwertowany i dlaczego normalna mapa jest niebieska i fioletowa?
11
Ponieważ normalna mapa obejmuje wektory od -1 do 1, sensowne jest rozciągnięcie tego zakresu na 0-> 1, aby wszystko mieściło się w zakresie RGB.
Dlatego zwykle stosujemy transformację normalnie, aby przekształcić ją w coś, co możemy zobaczyć.
vec3 colour = vec3(0.5) + normal * 0.5;
Kolor niebieski wynika z tego, że normalne mapy mają być używane względem pierwotnej (trójkąt / etc) normalnej z domyślnym kierunkiem (0,0,1), aby wskazać brak odchylenia od normalnej trójkąta. Zwykle moduł cieniujący fragmentów musi obracać tę normalną w stosunku do bieżącej normalnej na piksel w czasie wykonywania.
vec3 colour = vec3(0.5) + normal * 0.5;
konwertuje RGB na XYZ?vec3 normal = (colour - vec3(0.5)) * 2.0;
Tylko normalne mapy przestrzeni stycznej są głównie niebieskie. Wynika to z faktu, że kolor niebieski reprezentuje normę (0,0,1), która byłaby niezmienioną normą, gdy trójkąt leży w płaszczyźnie xiy, tj. Prostopadle do powierzchni. Styczna, x i styczna podwójna, y (określana również jako b-normalna) są kodowane w kanałach czerwonym i zielonym i tworzą one przestrzeń normalną dla stycznej do punktu na powierzchni trójkąta.
Jeśli mapa normalnej przestrzeni stycznej miałaby kodować kolor tylko na czerwono (1,0, 0,0, 0,0), wygenerowałoby to normalną przestrzeń stycznej równoległą do powierzchni trójkąta. Nigdy nie jest to widoczne, ponieważ oznaczałoby to, że trójkąt byłby kiedykolwiek oświetlony tylko w 90 stopniach od powierzchni i wektora widoku, w którym to momencie i tak nie byłbyś w stanie zobaczyć trójkąta.
Normalne mapy przestrzeni kosmicznej kodują normalną jednostkę na kuli, więc mogą być przede wszystkim różnymi kolorami po kodowaniu od [-1, 1] do [0, 1] na kanał.
Porównanie można zobaczyć tutaj:
W praktyce normalne mapy są zwykle kodowane w formacie 2-kanałowym, takim jak BC5, który faktycznie przechowuje tylko xiy przy rekonstrukcji z, ponieważ wiemy, że jest to wektor jednostkowy. Pozwala to zachować wyższą precyzję przy większej liczbie bitów bez zwiększania rozmiaru pliku.
źródło