Является ли 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 );

Другие вопросы по тегам