И така, попаднах на някои странности между GLSL и GLM.
Ако генерирам следната матрица на изглед (C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
И след това в glsl направете:
fragColour.rgb = vec3(inverse(viewMat) * vec4(0,0,0,1)) / 4.f;
Тогава очаквам екранът да стане розово-червен или (1.0,0.25,0.25). Вместо това ми става черно.
Ако обаче направя това в GLM:
vec3 colour = vec3(glm::inverse(viewMat) * vec4(0,0,0,1)) / 4.f;
cout << glm::to_string(colour) << endl;
Получавам очаквания резултат от (1.0,0.25,0.25).
Сега, ако променя viewMat на (C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0.000001, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
Тогава бам! Получавам (1.0,0.25,0.25) както в GLSL, така и в GLM.
Това няма смисъл за мен. Защо прави това? Тази матрица на изглед работи добре навсякъде другаде в GLSL - просто не мога да я обърна. Това се случва винаги, когато dirY == 0.f.
Също така, моля, предложете подобрения за заглавието на въпроса, не съм сигурен какво трябва да бъде.
Редактиране: Също така, изглежда няма нищо общо с up вектора на lookAt (който така или иначе зададох на Z). Дори и да задам (0,1,0), същото се случва. Всичко се обръща настрани, но все още не мога да обърна матрицата на изгледа в GLSL.
Редактиране: Добре, така че по предложение на derhass, опитах да изпратя матрицата на изгледа вече обърната. Бам, работи перфектно. Така че изглежда, че моята GL реализация наистина е някак неспособна да обърне тази матрица. Това би трябвало да е най-странната грешка в GL, която някога съм срещал. Все пак би било оценено някакво обяснение защо е лоша идея да се обръщат матрици в шейдъри. EditAgain: Изпращането на обърнати матрици в моя двигател доведе до огромно увеличение на честотата на кадрите. ОПРЕДЕЛЕНО ДА НАПРАВИ ТОВА.