glm::ortho返回tmat4x4<lowp_float>无法转glm::mat4如何解决?
问题原因
这个报错是因为glm::ortho返回的是低精度浮点类型的glm::detail::tmat4x4<glm::lowp_float>(即glm::lowp_mat4),而你声明的glm::mat4默认是高精度浮点矩阵的别名,二者精度不匹配,无法自动完成类型转换。
修复方案
你可以任选以下任意一种方案解决:
- 方案一:显式指定
glm::ortho的模板精度为高精度,适配glm::mat4的类型要求,修改代码为:
glm::mat4 projection = glm::ortho<glm::highp_float>(0.0f, static_cast<float>(this->Width), static_cast<float>(this->Height), 0.0f, -1.0f, 1.0f);
这是兼容性最好的解决方案,不受全局宏或者GLM版本差异影响。
- 方案二:统一使用低精度矩阵接收返回值,如果你不需要高精度的投影矩阵计算,可以将变量声明改为匹配的低精度类型:
glm::lowp_mat4 projection = glm::ortho(0.0f, static_cast<float>(this->Width), static_cast<float>(this->Height), 0.0f, -1.0f, 1.0f);
注意后续所有用到这个projection变量的逻辑,都要统一使用低精度矩阵类型。
- 方案三:检查并删除全局强制低精度的宏:如果你的代码预处理阶段定义了
GLM_FORCE_PRECISION_LOWP_FLOAT这类强制全局低精度的宏,删除该宏后GLM会默认返回高精度矩阵,和glm::mat4类型自动匹配。 - 方案四:显式强制类型转换:你也可以直接对返回的低精度矩阵做强制转换,不过该方法的类型安全性低于上述方案:
glm::mat4 projection = glm::mat4(glm::ortho(0.0f, static_cast<float>(this->Width), static_cast<float>(this->Height), 0.0f, -1.0f, 1.0f));
内容的提问来源于stack exchange,提问作者Sharofiddin Azizmatov
相关产品推荐
相关产品推荐

