Какие значения должен содержать glm :: mat4 через конструктор с нулевым аргументом? - PullRequest
0 голосов
/ 12 сентября 2018

Какие значения должен содержать glm :: mat4, полученный через конструктор с нулевым аргументом? В 64-битной Windows 10 с использованием 64-битной GLM v0.9.9.0, установленной через vcpkg, результат glm::mat4() - это матрица 4x4, заполненная нулями. Это то же самое на 64-битной Ubuntu 18.04 LTS с GLM по умолчанию.

С другой стороны, в верхней части GLM type_mat4x4.inl я вижу, что существует определение, которое устанавливает содержимое, равное единичной матрице. (Это условно исключено для двух сборок, которые я описал выше.) Мой коллега, однако, сообщил мне, что вызов glm::mat4() в его системе действительно производит идентификационную матрицу.

Отражают ли такие различия недавнее изменение в GLM? То есть исчезли бы различия, если бы мы все использовали последнюю версию GLM? Или, по замыслу, GLM выдаст два разных результата на двух разных системах?

1 Ответ

0 голосов
/ 12 сентября 2018

С GLM-сайта :

GLM предоставляет классы и функции, разработанные и реализованные с теми же соглашениями и функциями именования, что и GLSL

И GLSL spec

Если в конструкторе матрицы имеется один скалярный параметр, он используется для инициализации всех компонентов по диагонали матрицы, а остальные компоненты инициализируются равными 0,0.

Итак, glm::mat4() - это матрица со всеми нулями, а glm::mat4(1) - это единичная матрица.

В версиях GLM до 0.9.9 вы можете найти в type_mat4x4.inl

#   if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT)
            template <typename T, precision P>
            GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4()
            {
#           ifndef GLM_FORCE_NO_CTOR_INIT 
                this->value[0] = col_type(1, 0, 0, 0);
                this->value[1] = col_type(0, 1, 0, 0);
                this->value[2] = col_type(0, 0, 1, 0);
                this->value[3] = col_type(0, 0, 0, 1);
#           endif
            }
#   endif

И это изменилось в 0.9.9

#   if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
        template<typename T, qualifier Q>
        GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat()
#           if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST
                : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)}
#           endif
        {
#           if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION
                this->value[0] = col_type(1, 0, 0, 0);
                this->value[1] = col_type(0, 1, 0, 0);
                this->value[2] = col_type(0, 0, 1, 0);
                this->value[3] = col_type(0, 0, 0, 1);
#           endif
        }
# endif

Другими словами: GLM позволяет и всегда разрешал изменять инициализацию GLSL по умолчанию, играя с некоторыми #define s.Если нет, glm::mat4() всегда будет со всеми нулями.

...