用于3D图形的QOpenGLFrameBufferObject

时间:2018-08-21 09:43:27

标签: qt opengl framebuffer

我目前正在为某些3D模型(描绘建筑物的各种大小的立方体)在Qt中创建openGL缓冲区。

我尝试研究一些示例,但仅发现了一些2D示例。我尝试将其用于3D,但当我将缓冲区转换为要检查的图像时,充其量只能得到空白图像。

我使用以下方法获得了最大的成功(至少正在创建图像):https://dangelog.wordpress.com/2013/02/10/using-fbos-instead-of-pbuffers-in-qt-5-2/

我当前的代码如下:

QOpenGLFramebufferObject* SBuildingEditorUtils::getFboForBuilding(Building bd)
{
    glPushMatrix();
    QSurfaceFormat format;
    format.setMajorVersion(4);
    format.setMinorVersion(3);

    QWindow window;
    window.setSurfaceType(QWindow::OpenGLSurface);
    window.setFormat(format);
    window.create();

    QOpenGLContext context;
    context.setFormat(format);
    if (!context.create())
        qFatal("Cannot create the requested OpenGL context!");
    context.makeCurrent(&window);

    // TODO: fbo size = building size
    QOpenGLFramebufferObjectFormat fboFormat;
    fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
    //fboFormat.setAttachment(QOpenGLFramebufferObject::Depth);
    auto fbo = new QOpenGLFramebufferObject(1500, 1500, fboFormat);
    auto res = glGetError();
    auto bindRet = fbo->bind();
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    glOrtho(0, 1500, 0, 1500, 0, 1500); 
    glMatrixMode(GL_MODELVIEW);
    glBegin(GL_POLYGON);
        glVertex3d(500, 500, 500);
        glVertex3d(500, 1000, 1000);
        glVertex3d(1000, 1000, 1000);
        glVertex3d(1000, 500, 500);
    glEnd();
    glDisable(GL_DEPTH_TEST);
    fbo->toImage().save("uniqueName.png");
    fbo->release();
    glPopMatrix();

    return fbo;
}

在这里,我一直在使用图像“ uniqueName.png”将输出文本发送给我。如您所料,这里的大多数代码仅用于测试。另外,此代码是较大代码库的一部分。

关于我可能缺少的任何建议。虽然我在Qt上有一些经验,但是我没有任何有关openGL的正规教育/培训。任何帮助将不胜感激。

我想知道如何使代码起作用。

谢谢。

0 个答案:

没有答案