之后,我升级到了Qt 5.2,并对Qml(之前没有尝试过)非常感兴趣。我稍微试验了一下2D Qml图形,并决定将其用于用户界面,但拒绝了2D项目并返回3D。我创建了一个新的qml项目,尝试像Scene Graph - OpenGL Under QML示例中那样在qml下渲染一些东西。之后,我将我的旧代码从3D项目移动到新项目中,并进行了一些小的重构(不应该影响任何内容)。
此时,我遇到了一些奇怪的bug。似乎第一帧被正确地呈现,但之后就出了问题。
这是一些比较正常的帧(在任何移动之前)的场景视图。
在左上角输出深度缓冲区(阴影图)。在右上角,我使用qml制作了一些自定义滚动条。我使用这些滚动条来改变阴影图的旋转和移动相机。当滚动条居中时,没有任何移动。当我改变一些东西时,场景变得丑陋,我不知道为什么。
我看到阴影图深度缓冲区没有改变(为什么?o_0),场景中的阴影出现了问题。但是,在将我的旧代码重构为qml项目后,不仅阴影失败了。当我移动相机时,错误变得更加奇怪。
场景是通过以下方式在qml下呈现的:
![Scene view after some shadow map rotate](https://istack.dev59.com/O1Vv7.webp)
![Scene after moving camera down (-Z)](https://istack.dev59.com/78Tre.webp)
connect(window, &QQuickWindow::beforeRendering, this, &MyApp::renderScene, Qt::DirectConnection);
在 renderScene 中,我:
Do some OpenGL conveyor setup (to prevent changes by Qml Scene Graph, may be excess);
glViewport(0, 0, window->width(), window->height()); glClearColor(0, 0, 0, 1); glClearDepth(1); glDepthRange(0,1); glDepthFunc(GL_LEQUAL);
Call BulletPhysics to calculate physics (in test scene - two falling cubes)
- Render shadow map (depth-only) to RenderBuffer (2048x2048 texture, GL_DEPTH_COMPONENT24)
- Render scene to RenderBuffer (two GL_RGBA8 textures for color and normals and one GL_DEPTH_COMPONENT24 for depth)
- Render two 2d quads - fullscreen (scene render with all textures from renderbuffer to render with shadows) and side screen (top left corner's texture from depthbuffer)
我已经很累了,但是 glGetError 没有显示任何东西。
通过 XY 轴再次移动相机。人角的剪影依然可见,并产生奇怪的效果
更多截图:
旧项目(不包含 qml)
旧项目(大截图)
在新项目中,窗口调整大小也出现了问题
这可能是什么原因呢?
环境: Qt Creator 3.0.0, Qt 5.2.0, Linux (Kubuntu 13.10) 64-bit, HD 7750
OpenGL: 在旧项目中,我设置了 3.3,在新项目中使用了 4.3(据我所记)
P.S. 深度图像失真是因为我在着色器中使用了一些额外的畸变来改善场景中心的阴影。