在我的 OpenGL“main.cpp”文件中,我构造了视图、模型和模型视图矩阵(相应的 vMat、mMat 和 mvMat),其类型为 glm::mat4,在此代码中使用:
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>
glm::mat4 vMat, mMat, mvMat;
--程序--
void applyMatrices(GLFWwindow* window){
mvLoc = glGetUniformLocation(renderingProgram, "mv_matrix");
projLoc = glGetUniformLocation(renderingProgram, "proj_matrix");
glfwGetFramebufferSize(window, &width, &height);
aspect = (float)width / (float)height;
projMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);
// glm::mat4(1.0f) : an identity matrix
vMat = glm::translate(glm::mat4(1.0f), glm::vec3(-1.0f, -1.0f, -1.0f));
mMat = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, 1.0f));
mvMat = vMat * mMat;
glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvMat));
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projMat));
}
void display(GLFWwindow* window, double currentTime) {
...
applyMatrices(window);
...
}
int main() {
...
while (!glfwWindowShouldClose(window)) {
display(window, glfwGetTime());
...
}
...
}
--程序--
问题就在一线
mvMat = vMat * mMat;
发生矩阵乘法的地方,如果我**删除**将使程序编译成功,但如果不这样做,将会抛出许多关于GLM库的mat4类型的不同错误,例如:
“隐式定义的构造函数未初始化
'float glm::vec<4, float(glm::qualifier)0u>::
我已经尝试过像这样**预先**启动所有三个矩阵:
glm::mat4 vMat = glm::mat4(1.0f);
glm::mat4 mMat = glm::mat4(1.0f);
glm::mat4 mvMat = glm::mat4(1.0f);
但这并没有改变任何事情。我查看了我的 C++ 版本 (C++ 20) 是否与 GLM 的矩阵工作不兼容,但即使更改为较旧的 C++ 版本也没有帮助。我不确定 GLM 是否正在努力与我的编译器(MinGW 版本 6.3)一起工作,但我不确定。
我认为重要的是确保您使用的编译器和 C++ 标准实际上受 GLM 支持:
c++11
使用 GLM 构建代码。尝试使用旧标准(如
c++11
或
c++14
)而不是
c++20
来构建代码可能是个好主意。
#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
glm::mat4 vMat = glm::mat4(1.0f);
glm::mat4 mMat = glm::mat4(1.0f);
glm::mat4 mvMat = glm::mat4(1.0f);