2012-06-04 9 views
9

Robię oświetlenie za fragment i przy korygowaniu normalnego vectera, mam ten kod: vec3 f_normal = mat3(MVI) * normal; Gdzie MVI to: mat4 MVI = transpose(inverse(ModelViewMatrix));. Więc czym jest zwrot po oświadczeniu mat3(MVI)?Co zrobić z wyrażeń mat3 (macierz mat4) w glsl?

+2

Cóż, proste rozumowanie (i tylko małe zrozumienie matematycznych podstaw grafiki komputerowej) dyktuje, że jest to lewy górny fragment 3x3. Poza tym za wszelką cenę nie transponuj i nie odwracaj matrycy w module cieniującym. Nie zmienia się on w jeden wierzchołek i może być wykonywany na procesorze (gdzie nie zajmuje dłużej dla pojedynczej macierzy). –

Odpowiedz

11
mat3(MVI) * normal 

Zwraca górną matrycę 3x3 z macierzy 4x4 i mnoży przez to normalnie. Ta macierz nazywa się "normalną matrycą". Używasz tego, aby wprowadzić swoich normaliów z kosmosu do przestrzeni oczu. Górna część 3x3 macierzy jest ważna dla skalowania i obrotu, podczas gdy reszta jest tylko dla translacji (a normalne nie są nigdy tłumaczone)

Aby uzyskać normalną przestrzeń od przestrzeni kosmicznej do przestrzeni oczu, wystarczy odwrócić 3x3 transponuj macierzy widoku modelu. O ile twoja matryca w normalnym stanie (brak niejednolitej skali) w tym przypadku oryginalna macierz jest taka sama jak jej odwrotna transpozycja.

+0

Używanie górnego 3x3 macierzy widoku modelu działa tylko wtedy, gdy nie ma niejednolitych skal, w przeciwnym razie trzeba użyć transpozycji odwrotności widoku modelu (który jest macierzą 4x4). Zauważ, że musisz ustawić składową w normalnej do zera podczas mnożenia przez macierz 4x4. –

+0

@rawarate correct. Zmienię moją odpowiedź, aby uniknąć złych pomysłów. –

2

Od GLSL types: "Nie ma żadnych ograniczeń co do rozmiaru podczas tworzenia macierzy z innej macierzy, więc można zbudować macierz 4x2 z macierzy 2x4, tylko odpowiednie elementy zostaną skopiowane.". Otrzymujesz lewą górną lewą podrzędność 3x3 MVI.

+0

Dzięki za szybką odpowiedź, więc wpływa na końcowy wynik? (dlaczego nie używa czwartego elementu w normalnym wektorze, ale usuwa niektóre elementy na MVI?) –

+3

Jest to operacja ogólna i nic nie wie o semantyce podstawowej matrycy, na której operuje. –