Является ли glm::ortho() ошибочным?
Недавно я подумал, что было бы неплохо переключиться со старой (устаревшей) функциональности, предоставляемой OpenGL, такой как матричные операции и конвейер фиксированных функций.
Я использую GLM как свою матричную библиотеку, чтобы немного упростить вещи. Проблема в том, что это могло вызвать больше проблем, чем упростить...
Перспективные проекции работали нормально с моими шейдерами и настройками, но когда я попытался переключиться на ортогональную, все сломалось. Мои очки и простые четверки не будут отображаться. Когда я использовал старые матрицы OpenGL, все снова заработало.
Я сузил все это до матрицы проекции. Вот как я это назвал:
glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );
Я сравнил это с предоставленным opengl, как только это называется
glOrtho( 0, 400, 0, 400, -1, 1 );
Единственными отличиями являются элемент [0][0] и элемент [1][1] (которые, насколько я знаю, равны "2/ ширина" и "2/ высота" соответственно). Из матрицы OpenGL значения были именно такими! На матрице glm, однако, значения были 0.
Как только я вручную переключил значения из матрицы glm после того, как вызвал glm::ortho, все снова заработало!
Итак, мой вопрос: действительно ли не работает функция glm::ortho(), или я просто неправильно ее использую?
1 ответ
Не похоже, что он должен быть вырван из исходного кода (v 0.9.3.4)
template <typename valType>
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
(
valType const & left,
valType const & right,
valType const & bottom,
valType const & top,
valType const & zNear,
valType const & zFar
)
{
detail::tmat4x4<valType> Result(1);
Result[0][0] = valType(2) / (right - left);
Result[1][1] = valType(2) / (top - bottom);
Result[2][2] = - valType(2) / (zFar - zNear);
Result[3][0] = - (right + left) / (right - left);
Result[3][1] = - (top + bottom) / (top - bottom);
Result[3][2] = - (zFar + zNear) / (zFar - zNear);
return Result;
}
Я думал только о том, что этот шаблон может создавать матрицу целых чисел (так как вы передали все целые числа в функцию) и, таким образом, делать целочисленное деление вместо плавающей запятой. Вы можете попробовать добавить .f
на все ваши параметры?
glm::mat4 projMat = glm::ortho( 0.f, 400.f, 0.f, 400.f, -1.f, 1.f );