我目前正在为某些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的正规教育/培训。任何帮助将不胜感激。
我想知道如何使代码起作用。
谢谢。