QOpenGLContext get GL_MAX_TEXTURE_SIZE始终返回0

时间:2014-03-30 19:41:17

标签: c++ opengl qt5

我希望在Qt"早期"中获得GL_MAX_TEXTURE_SIZE的值。因为我将为我的应用程序生成一些纹理图集。

我知道glGetIntegerv没有"有效"上下文。所以我创建了一个QOpenGLContext,然后调用glGetIntegerv,但这仍然返回0,为什么?

QOpenGLContext c;
if ( !c.create() )
{
    abort();
}

int maxSize = 0;
glEnable(GL_TEXTURE_2D);
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);

// maxSize == 0

auto err = glGetError();
// err == 0 too!

目标平台是Linux,在终端中运行glxinfo -l | grep MAX_TEXTURE_SIZE返回

GL_MAX_TEXTURE_SIZE = 16384
GL_MAX_TEXTURE_SIZE = 16384

我应该注意到我在QApplication之前创建了一个QOpenGLContext实例,但此代码在QApplication事件循环之前执行。

2 个答案:

答案 0 :(得分:2)

经过大量挖掘后,您的上下文似乎必须是最新的,这需要一个表面。由于你可能不希望有一些随机的QWindow闲逛,Qt的人已经添加了QOffscreenSurface

http://qt-project.org/doc/qt-5.1/qtgui/qoffscreensurface.html

    // Create a temp context - required if this is called from another thread
    QOpenGLContext ctx;
    if ( !ctx.create() )
    {
        // TODO handle the error
    }

    // rather than using a QWindow - which actually dosen't seem to work in this case either!
    QOffscreenSurface surface;
    surface.setFormat( ctx.format() );
    surface.create();

    ctx.makeCurrent(&surface);

    // Now the call works
    int maxSize = 0;
    glEnable(GL_TEXTURE_2D);
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);

答案 1 :(得分:1)

我认为你的问题是你没有激活OpenGL上下文。

查看示例: http://qt-project.org/doc/qt-5.0/qtgui/openglwindow.html

尝试复制该示例并检查此行后的纹理大小:

m_context->makeCurrent(this);

<强>更新: 选中enter image description here