Qt 5.0.2 和 OpenGL 3+ 的渲染问题

3
我已经编写了一个使用三个以上函数的小型OpenGL引擎。我目前正在尝试将我的引擎集成到QGLWidget中,但遇到了问题。在没有Qt框架的情况下渲染obj模型时,我得到了预期的结果,但是在使用Qt时,我的OpenGL缓冲区以某种方式被破坏,导致我看到错误的结果甚至什么都看不到。
没有Qt时: renders nice without Qt 在QGLWidget中: strange behavious in QGLWidget 我想问一下Qt是否会在QGLWidget::paintGL()调用之间更改任何OpenGL状态。我的对象按以下顺序初始化和渲染:
初始化:
Create and bind vertex array
Create and bind vertex buffer
Fill vertex buffer (works fine - obj loader tested many times)
Calls to glVertexAttribPointer() and glEnableVertexAttribArray()

渲染:

Bind vertex array
Shaders, uniforms, etc.
glDraw*()

1
看起来你的纹理没有加载?我猜你的树枝/叶子是有纹理的多边形,在第二张图片中它们看起来像实心多边形。如果你正在从文件中加载纹理,你是否检查过它们是否成功加载了? - Reto Koradi
@Reto Koradi,纹理已正确加载并在顶点数组之前绑定。此外,这不是唯一的问题:某些方式损坏了顶点缓冲区:只需查看棕榈树干和盒子即可。 - RostakaGmfun
真的很难说它可能是什么。您调用了 glGetError(),并确保它没有抱怨任何事情?而且您只在已创建并处于当前状态的上下文中进行GL调用的方法中进行调用?您的代码中可能已经存在错误,并且您之前只是幸运地使其工作。特别是,我会仔细查看所有对象ID的管理。确保它们都正确生成,不会意外删除(在将它们包装在C ++对象中时非常常见),并且在所有地方使用正确的ID。 - Reto Koradi
@Reto Koradi,我发现了一些有趣的细节。我已经将从OBJ文件加载的顶点和纹理坐标列表记录到文件中。似乎在Qt框架组件中,glm :: vec3和glm :: vec2(我使用GLM作为数学库)的部分被以某种方式舍入为int值。这就是为什么没有纹理的原因:纹理坐标已损坏 - (0,0)而不是浮点值。我仍然不明白发生了什么。顺便说一下,我使用GCC和QtCreator,并静态链接我的应用程序与引擎。 - RostakaGmfun
@Reto Koradi,我发现问题是由std::stof()引起的,在我的非Qt项目中返回浮点数,但在Qt项目中这些值变成了四舍五入。我不知道为什么会发生这种情况,因为我的引擎与Qt无关。引擎库和非Qt和Qt项目都使用G++编译。 - RostakaGmfun
显示剩余3条评论
1个回答

1
您看到的问题是因为Qt在您的系统上为您设置了C语言环境,该环境期望小数点为逗号而不是句点。
您可以通过在调用QApplication后立即将本地设置为其他值来解决此问题。
例如:
std::setlocale(LC_ALL, "POSIX");

那时已经过去了这么久... 无论如何,你的答案是真诚的!还是非常感谢! - RostakaGmfun
我想既然我也遇到了同样的问题,那就提前回答一下给下一个人看吧!你的问题是我找到的唯一一个。 - lefticus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接