Итак, я столкнулся с некоторыми странностями между GLSL и GLM.
Если я сгенерирую следующую матрицу представления (С++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
А затем в gsl выполните:
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.
Кроме того, предложите улучшения для заголовка вопроса, я не уверен, каким он должен быть.
Редактировать: Кроме того, похоже, это не имеет ничего общего с вектором вверх lookAt (который я все равно установил на Z). Даже если я настрою на (0,1,0), произойдет то же самое. Все выворачивается набок, но я все равно не могу инвертировать матрицу вида в GLSL.
Редактировать: Хорошо, поэтому по предложению Дерхасса я уже пытался отправить матрицу представления в инвертированном виде. Бам, отлично работает. Итак, похоже, что моя реализация GL действительно каким-то образом не способна инвертировать эту матрицу. Это должна быть самая странная ошибка GL, с которой я когда-либо сталкивался. Однако было бы полезно какое-то объяснение того, почему инвертировать матрицы в шейдерах - плохая идея. EditAgain: отправка инвертированных матриц через мой движок привела к огромному увеличению частоты кадров. ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ ЭТО.