我希望在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
事件循环之前执行。
答案 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);
<强>更新强>: 选中