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?
Odpowiedz
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.
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. –
@rawarate correct. Zmienię moją odpowiedź, aby uniknąć złych pomysłów. –
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.
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?) –
Jest to operacja ogólna i nic nie wie o semantyce podstawowej matrycy, na której operuje. –
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). –