在Qml场景下使用OpenGL进行渲染时出现奇怪的错误
作为一个爱好,我正在尝试OpenGL,并用Qt + OpenGL编写我自己的愚蠢引擎。 最后的成功是构建实体系统框架,该实体系统框架可以通过附加的物理引擎(BulletPhysics)渲染具有阴影的场景(通过渲染到纹理渲染到渲染缓冲区)。
之后,我更新到Qt 5.2,并完全由Qml表示(以前不尝试使用它)。 我尝试了一下2d qml图形,并决定使用qml作为用户界面,但拒绝2d项目并返回到3d。 我创建了新的qml项目,尝试渲染qml下的一些东西,如QML示例中的场景图形 - OpenGL。 之后,我将旧代码从3d项目移至新项目,并进行了一些小的重构(这不应该影响任何内容)。
在这一刻,我厌倦了一些奇怪的错误。 看起来第一帧是根据需要渲染的,但之后出现了一些问题。
这是一个更少或更多的正常帧(在任何移动之前)
在左上角我输出深度缓冲区(阴影图)。 在右上角,我使用qml制作了一些自定义滚动条。 我正在使用此滚动条来更改阴影贴图旋转和移动摄像头。 当卷轴居中时,没有任何动作。 当我改变某些东西时,场景变得丑陋,我不知道为什么。
这是一些阴影贴图旋转后的框架
我看到阴影贴图深度缓冲区没有改变(为什么?o_0)和场景中的阴影出错了。 但是不仅影子在将我的旧代码重构为qml项目后失败了。 当我移动相机时,错误变得更加奇怪。
这是移动相机后的框架(-Z)
场景通过使用以下内容在qml下呈现:
connect(window, &QQuickWindow::beforeRendering, this, &MyApp::renderScene, Qt::DirectConnection);
在renderScene I中:
做一些OpenGL传送带设置(防止Qml场景图更改,可能会过多);
glViewport(0, 0, window->width(), window->height());
glClearColor(0, 0, 0, 1);
glClearDepth(1);
glDepthRange(0,1);
glDepthFunc(GL_LEQUAL);
调用BulletPhysics来计算物理(在测试场景中 - 两个下降的立方体)
我厌倦了追捕正在发生的事情。 glGetError不显示任何内容。
通过XY轴再次移动摄像机。 人角剪影仍然可见,并产生奇怪的效果
一些更多的截图:
旧项目(不含qml)
旧项目(大截图)
在新项目上,窗口大小也被打破
它会是什么?
环境:Qt Creator 3.0.0,Qt 5.2.0,Linux(Kubuntu 13.10)64位HD 7750
OpenGL:在旧项目中我设置了3.3,新项目使用了4.3(据我所知)
PS深度图失真,因为我在着色器中使用了一些额外的变形来改善场景中心中的阴影。
经过一天没有答案和很多以前的日子,我的灵感来到了我的身上!
我怀疑深度缓冲区出了问题,并尝试输出以调试用于渲染并用于渲染为全屏四边形的纹理ID。 我尝试关闭渲染到纹理缓冲区交换等等。 但我甚至不认为真正的问题在Qml方面。
glDepthMask(GL_TRUE); // 42!
其中一条线就像42
- 回答所有问题。 看起来Qml正在调用glDepthMask(GL_FALSE);
在第一次渲染帧之前(但是在发出&QQuickWindow::beforeRendering
信号之后)。 这次调用的结果是,只有首先我的帧真正写入深度缓冲区。 为什么我认为glDepthMask(GL_FALSE);
只被调用一次? 因为插入我的“42”后FPS明显下降,插入glDepthMask(GL_FALSE);
后增加glDepthMask(GL_FALSE);
在用于渲染我的场景的槽的末尾。
现在我可以自由旋转“太阳”(阴影)并移动相机,而不会有任何视觉错误。
yippee的!
链接地址: http://www.djcxy.com/p/63877.html上一篇: Strange bugs while rendering with OpenGL under Qml Scene