在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) 这是移动相机后的框架(-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来计算物理(在测试场景中 - 两个下降的立方体)

  • 将阴影贴图(仅限深度)渲染到RenderBuffer(2048x2048贴图,GL_DEPTH_COMPONENT24)
  • 将场景渲染到RenderBuffer(两个用于颜色和法线的GL_RGBA8纹理以及一个用于深度的GL_DEPTH_COMPONENT24)
  • 渲染两个二维四边形 - 全屏(场景渲染,渲染缓冲区中的所有纹理以阴影渲染)和侧边屏幕(来自深度缓冲区的左上角纹理)
  • 我厌倦了追捕正在发生的事情。 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

    下一篇: my scene is rendered upside down