1.创建子类继承QOpenGLWidget
2.重写三个虚函数
C++
/** 设置OpenGL的资源和状态,最先调用且调用一次
* @brief initializeGL
*/
virtual void initializeGL() override;
/** 设置OpenGL视口、投影等,当widget调整大小(或首次显示)时调用
* @brief resizeGL
* @param w
* @param h
*/
virtual void resizeGL(int w, int h) override;
/** 渲染OpenGL窗口,当窗口widget需要更新时调用
* @brief paintGL
*/
virtual void paintGL() override;
void CreateOpenGLWindow::initializeGL()
{
//设置清空屏幕的颜色,黑色
QOpenGLFunctions *f = context()->functions();
f->glClearColor(0.f,0.f,0.f,0.f);
}
void CreateOpenGLWindow::resizeGL(int w, int h)
{
//设置视口大小,与窗口一样
QOpenGLFunctions *f = context()->functions();
f->glViewport(0,0,w,h);
}
void CreateOpenGLWindow::paintGL()
{
// 每次重绘之前清空屏幕颜色和深度缓冲
QOpenGLFunctions *f = context()->functions();
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
initializeGL
:
设置OpenGL的资源和状态,最先调用且调用一次
paintGL
:
渲染OpenGL窗口,当窗口widget需要更新时调用。
在paintGL()以外的地方调用绘制函数是没有意义的,因为绘制图像最终将被paintGL()覆盖;
若需要从paintGL()以外的位置触发重新绘制(e.g. 使用计时器设置场景动画),则应调用widget的**update()**函数来安排更新。
resizeGL
:
设置OpenGL视口、投影等,当widget调整大小(或首次显示)时调用