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