c++ - C++ 程序使用不同的编译器改变行为
问题描述
我有一个问题,我的程序正在改变它的行为,这取决于它是否是从调试器启动的。二进制文件是一样的!我的问题是通过以下两种方式启动程序:
gdb game
vs 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()
调用突然具有非常奇怪的值。价值观,我从未提供过!
如果你想自己编译这个项目,你需要以下内容:
- SDL2 库和头文件
- GLEW 库和头文件
- 一个(工作的)cmake 环境
如果您运行的是 Linux 或 Windows 并不重要,因为程序和编译都适用于两者。
编辑:在 Windows(使用 MINGW)上,问题与描述的完全一样,但在 Linux(使用 GCC)上一切正常。所以我猜,MINGW 是问题所在?
一旦使用 MINGW 解决了问题,我将问题标记为完成。
解决方案
glm::mat4x4 rotation;
类中的属性Face
未初始化。
5.4.2 向量和矩阵构造函数
如果向量构造函数有一个标量参数,则它用于将构造向量的所有组件初始化为该标量的值。如果矩阵构造函数只有一个标量参数,则它用于初始化矩阵对角线上的所有分量,其余分量初始化为 0.0。
这意味着,单位矩阵可以由单个参数 1.0 初始化:
glm::mat4 rotation = glm::mat4(1.0f);
推荐阅读
- scala - scala 3 内联失败了一个非常简单的例子
- wordpress - 在外部 URL 中打开自定义 Wordpress 管理菜单项
- angular - 搜索栏未返回预期结果
- php - 基于多个值合并多维数组中的数组
- flutter - 无法在颤动的 Firestore 中获取文档
- kubernetes - 在所有容器中打开端口
- r - 使用for循环和滞后函数对具有神经网络的时间序列进行数据格式化
- selenium - 如何在不确定的时间范围内运行代码时每分钟输出一个 csv 文件?
- c++ - 如何导入数组
从 Kotlin 到 JNI? - mysql - MYSQL 查询慢 SELECT DISTINCT