使用QOpenGLFramebufferObject的OpenGL深度缓冲区不起作用

时间:2014-04-10 12:14:38

标签: qt opengl depth-buffer

我遇到的问题是OpenGL场景的深度没有正确呈现。我在屏幕外渲染到QOpenGLFramebufferObject。如果我在QGLWidget中运行相同的代码,它会渲染得很好。这是代码:

// SETUP
SurfaceFormat format;
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!");
}

QOpenGLFramebufferObjectFormat fboFormat;
fboFormat.setAttachment(QOpenGLFramebufferObject::Depth);
QSize drawRectSize(640, 480);

context.makeCurrent(&window);

QOpenGLFramebufferObject fbo(drawRectSize, fboFormat);
fbo.bind();

// OPENGL CODE
glViewport(0, 0, 640, 480);

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

glShadeModel(GL_FLAT);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLoadMatrixf(pose->getOpenGLModelView());

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* calculate prjection parameters */
gluPerspective(fov, aspect, 0.01, 1.0f);

glColor3d(1, 0, 0);
glBegin(GL_TRIANGLES);

/* Draw triangles */

glEnd();

glFlush();

QImage result = fbo.toImage());

任何想法我做错了什么?我检查了GL_DEPTH_BITS,它似乎是0.提前感谢:)

1 个答案:

答案 0 :(得分:0)

在您的代码中,您永远不会请求您的FBO的深度附件。你似乎只是

QOpenGLFramebufferObjectFormat fboFormat;
QOpenGLFramebufferObject fbo(drawRectSize, fboFormat);

根据Qt文档,QOpenGLFramebufferObjectFormat构造函数将执行以下操作:

  

默认情况下,格式指定非多重采样帧缓冲对象   没有附件,纹理目标GL_TEXTURE_2D和内部格式   GL_RGBA8。在OpenGL / ES系统上,默认的内部格式是   GL_RGBA。

查看有关如何设置正确格式的Qt Documentation