矩阵乘法时不能使用*运算符

问题描述 投票:0回答:1

在我的 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>::::x'union { T x, r, s; };“

我已经尝试过像这样**预先**启动所有三个矩阵:

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++ math opengl glm-math
1个回答
0
投票

我认为重要的是确保您使用的编译器和 C++ 标准实际上受 GLM 支持:

    GCC 4.7 及更高版本
  • 英特尔 C++ Compose XE 2013 及更高版本
  • Clang 3.4 及更高版本
  • Apple Clang 6.0 及更高版本
  • Visual C++ 2013 及更高版本
  • CUDA 9.0 及更高版本(实验性)
  • 任何 C++11 编译器
以下是其他相关建议:

    至少使用
  • c++11
     使用 GLM 构建代码。尝试使用旧标准(如 
    c++11
    c++14
    )而不是 
    c++20
     来构建代码可能是个好主意。
  • 尝试定义下面的宏,以确保类型针对 SIMD 操作(单指令、多数据)正确对齐:
#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES

    确保初始化 4x4 矩阵:
glm::mat4 vMat = glm::mat4(1.0f); glm::mat4 mMat = glm::mat4(1.0f); glm::mat4 mvMat = glm::mat4(1.0f);
    
© www.soinside.com 2019 - 2024. All rights reserved.