首页 > 解决方案 > C++ 程序使用不同的编译器改变行为

问题描述

我有一个问题,我的程序正在改变它的行为,这取决于它是否是从调试器启动的。二进制文件是一样的!我的问题是通过以下两种方式启动程序:

gdb gamevs game(游戏是可执行文件。如果你在 Windows 上,则为 game.exe)

如果附加了调试器,我的程序将按预期工作。您应该在窗口中间看到一个 Square,它将打开。当您移动正方形(wasd/箭头键)时,您会看到,实际上有两个正方形堆叠在一起。 显示预期结果的图像

当程序在没有调试器的情况下启动时,第二个“固定”方块不存在。 图像显示,程序不应该做的事情

程序代码:https ://github.com/C0D3-M4513R/OpenGLGame/tree/development

问题是,在 applyMVP 调用中的 Shader.cpp 下,提供的 Matrix 其内容发生了变化,从 c++(在方法调用到 OpenGL 之前)到 OpenGL(方法调用,改变了 OpenGL 状态)

void Shader::applyMVP(glm::mat4 model) const {
    //TODO::Projection Matrix
//    glm::mat4 mvp = Renderer::getCamera()->view() * model;
    glm::mat4 mvp = model;
    const float* mvpPointer = glm::value_ptr(mvp);

#ifndef DEBUG
    for(unsigned int i = 0; i < 16; i++){
        SDL_LogVerbose(SDL_LOG_CATEGORY_SYSTEM,"MVP Matrix[%u]: %f",i,mvpPointer[i]);
    }
#endif


    glUseProgram(program);
    GLuint MatrixID = glGetUniformLocation(program, "mvp");
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, mvpPointer);

    glUseProgram(0);
}

在我的代码中,一切都很好,但在 OpenGL 中,glUniformMatrix4fv()调用突然具有非常奇怪的值。价值观,我从未提供过!

如果你想自己编译这个项目,你需要以下内容:

如果您运行的是 Linux 或 Windows 并不重要,因为程序和编译都适用于两者。

编辑:在 Windows(使用 MINGW)上,问题与描述的完全一样,但在 Linux(使用 GCC)上一切正常。所以我猜,MINGW 是问题所在?

一旦使用 MINGW 解决了问题,我将问题标记为完成。

标签: c++openglmingwglm-mathglew

解决方案


glm::mat4x4 rotation;类中的属性Face未初始化。

glm API 文档参考了OpenGL 着色语言规范

5.4.2 向量和矩阵构造函数

如果向量构造函数有一个标量参数,则它用于将构造向量的所有组件初始化为该标量的值。如果矩阵构造函数只有一个标量参数,则它用于初始化矩阵对角线上的所有分量,其余分量初始化为 0.0。

这意味着,单位矩阵可以由单个参数 1.0 初始化:

glm::mat4 rotation = glm::mat4(1.0f); 

推荐阅读