通过零参数构造函数生成的glm::mat4应该包含什么值?在64位Windows10上,使用通过vcpkg安装的64位GLmv0.9.9.0,glm::mat4()
的结果是一个充满零的4x4矩阵。这在默认GLM的64位Ubuntu 18.04 LTS上是相同的。
另一方面,我可以在GLM的type_mat4x4.inl
的顶部附近看到,存在一个定义,它将内容设置为单位矩阵。(我在上面描述的两个构建中有条件地排除了这一点。)不过,我的同事告诉我,在他的系统上调用glm::mat4()
确实会生成一个标识矩阵。
这些差异是否反映了GLM最近的变化?也就是说,如果我们都使用最新版本的GLM,这些差异会消失吗?或者,GLM是故意在两个不同的系统上产生两个不同的结果吗?
发布于 2018-09-12 07:47:08
来自GLM site
GLSL提供了设计和实现的类和函数,其命名约定和功能与
相同
如果矩阵构造函数只有一个标量参数,它用于初始化矩阵对角线上的所有分量,其余分量初始化为0.0。
因此,glm::mat4()
是全零矩阵,glm::mat4(1)
是单位矩阵。
在GLM0.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
# 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允许并一直允许通过玩一些#define
来更改默认的GLSL初始化。如果不允许,glm::mat4()
将始终为全零。
https://stackoverflow.com/questions/52285271
复制相似问题