在QGLWidget中使用makeCurrent()的位置?

时间:2015-10-03 07:24:12

标签: c++ qt opengl

qt的文档说:

  

当paintGL()时,你的小部件的OpenGL渲染上下文是最新的,   调用resizeGL()或initializeGL()。如果你需要打电话给   来自其他地方的标准OpenGL API函数(例如,在您的小部件中)   构造函数或在您自己的绘制函数中),您必须调用   makeCurrent()首先。

对于以下情况:

paintGL()
{
    drawSomething();
}
...
drawSomething()
{
    glClearColor()...
    //many other gl calls...
}

我必须在drawSomething()函数中使用makeCurrent。

如果我只进行QPainter调用而不是标准的OpenGL API函数。我必须使用makeCurrent吗?

2 个答案:

答案 0 :(得分:2)

  

我必须在drawSomething()函数中使用makeCurrent。

如果仅从paintGL调用该函数,则不会,因为Qt将调用paintGL且上下文已经是当前的。

正如文档所说,只要你需要其他功能中的GL上下文当前,你就会需要它。

// called from other code, context may not be current
void MyGLWidget::setBackgroundColor(const QColor &color) {
     makeCurrent();
     glClearColor(color.redF(), color.greenF(), color.blueF(), color.alphaF());
}

答案 1 :(得分:1)

正如文件所述:

  

当调用paintGL()...

时,渲染上下文变为当前状态

因此无需在paintGL调用的任何方法中调用makeCurrent。使用QPainter时,也没有必要(顺便说一句:QPainter不一定使用OpenGL)。