Używanie głównego rzędu w shaderze OpenGL
Widziałem to naStrona OpenGL:
Zmienne atrybutów języka cieniowania OpenGL mogą być typu mat2, mat3 lub mat4. Atrybuty tych typów można załadować za pomocą punktów wejścia glVertexAttrib. Matryce muszą być ładowane do kolejnych szczelin atrybutów ogólnych w głównej kolejności kolumn, z jedną kolumną macierzy w każdym gnieździe atrybutu ogólnego.
Sukcesywnie korzystałem z biblioteki wektorowej opartej na wierszu głównym. Oznacza to, że 16 elementów macierzy 4x4 jest tak rozmieszczonych w strukturze:
vec4 x;
vec4 y;
vec4 z;
vec4 w;
Gdzie każdyvec4
ma komponentyx, y, z, w
, Więcporządek liniowy zawartości jest rzędem, ponieważ pierwszy wiersz zajmuje pierwsze 4 pozycje w pamięci, a matematyka macierzowa jest traktowana jako taka, na przykład ta transformacja obrotowa:
static Matrix4<T> RotateZ(T degrees)
{
T radians = degrees * 3.14159f / 180.0f;
T s = std::sin(radians);
T c = std::cos(radians);
Matrix4 m;
m.x.x = c; m.x.y = s; m.x.z = 0; m.x.w = 0;
m.y.x = -s; m.y.y = c; m.y.z = 0; m.y.w = 0;
m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1;
return m;
}
Biblioteka jest głównym narzędziem do obsługi obliczeń od lewej do prawej podczas pisania kodu po stronie klienta, co jest naturalne dla wielu programistów. Ale nie rozumiem, że te główne macierze są wysyłane do shaderów, które zgodnie z powyższym, oczekują kolumny głównej.
Rozumiem, że moduł cieniujący wykonuje obliczenia od prawej do lewej. Ale czy nie należy transponować matrycy rzędu rzędów, więc jest to kolumna główna przed wprowadzeniem do modułu cieniującego? Nie robiłem tego, ale to działa dobrze.