Qt如何处理对QGLWidget中各种OpenGL函数(如glVertex3f)的函数调用?
这些调用是否是QGLWidget对象的一部分,还是严格意义上的全局命名空间OpenGL函数?
从单独的类中绘制QGLWidget的最佳做法是什么?
答案 0 :(得分:3)
那些gl…
函数只是常规的OpenGL函数,或者如果使用扩展包装器,宏名称将解析为包装器的符号。 QGLWidget负责OpenGL上下文创建和管理,就像GLUT或GLFW一样。
QGLWidget提供成员函数QGLWidget::makeCurrent
,它选择QGLWidget实例的OpenGL上下文作为调用QGLWidget::makeCurrent
的线程中的当前上下文。 QGLWidget::swapBuffers
发出双缓冲交换。在使用完OpenGL上下文后,比如在渲染器函数的末尾,调用QGLWidget::doneCurrent
,它将从当前线程中分离上下文;这是使OpenGL在多线程程序中工作的必要条件 - 如果确保所有OpenGL操作都是在同一个线程中完成的,则可以省略对QGLWidget::doneCurrent
的调用。
当然,在一个真正的OOP时尚程序中,你应该将对另一个类的引用传递给你的QGLWidget派生,并从QGLWidget的绘图处理程序中调用那个绘图函数。
答案 1 :(得分:1)
它们是全局命名空间OpenGL函数。
在paintGL()函数中调用另一个类的绘图函数。
void MyGLWidget::paintGL()
{
other->draw();
}