Qt--QOpenGL

一. QGLWidget提供了三个方便的虚拟函数,可以在子类中重写这些函数来执行典型的OpenGL任务:

    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

paintGL():渲染OpenGL场景。每当需要更新小部件时调用。
resizeGL ():设置OpenGL视区、投影等。每当小部件调整了大小时都会调用该视区(并且当它第一次显示时也会调用,因为所有新创建的小部件都会自动获得一个调整大小的事件)。
initializeGL():设置OpenGL呈现上下文,定义显示列表等。在第一次调用resizeGL ()或paintGL ()之前调用一次。

initializeGL函数由于是初始化,所以只调用一次
而resizeGL和paintGL会多次调用
resizeGL在正常的情况下,触发的条件是,窗口大小发生变化时,resizeGL被调用,之后会触发paint事件,从而调用paintGL()事件处理器。
paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发paint事件,从而调用paintGL事件处理器。当然,还有窗口在隐藏和显示之间变换时,也会触发paint事件,从而调用paintGL事件处理器。

总结:
1:initializeGL()函数只在程序开始时运行一次,之后不会再运行
2:resizeGL()只在在窗口尺寸发生变化时,会自动运行,然后触发paint事件,从而调用paintGL()事件处理函数
3:paintGL()会在窗口位置移动时被调用,或是窗口在隐藏和显示之间变换时,被调用
4.updateGL()功能是触发paintGL()


二. 图形处理和着色器

 

 

 三. VBO顶点缓存对象和VAO

void OpenglWidget::initializeGL(){
    QOpenGLFunctions_3_3_Core* core;
    core=QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();

    /*先准备好VAO、VBO 的部分数据,注意必须在-1~1之间,如果不在范围内,就不会再视口中出现*/
    GLfloat verticals[]={//VBO顶点缓存数据
        -0.5f,-0.5f,0.0f,//left
         0.5f,-0.5f,0.0f,//right
         0.0f,-0.5f,0.0f//top
    };
    //先创建VBO
    GLuint VBO;//代表显卡缓存中的地址
    core->glGenBuffers(1,&VBO);//参数1:生成缓冲对象的个数,参数2:要输入保存缓冲区对象

    //绑定地址与数据
    core->glBindBuffer(GL_ARRAY_BUFFER,VBO);//绑定缓冲对象
    //把当前绑定在某种类型的缓冲,所指向的内存对象从传输到GPU的缓冲区
    core->glBufferData(GL_ARRAY_BUFFER,sizeof(verticals),verticals,GL_STATIC_DRAW);
}

 

posted on 2021-07-08 09:22  斗战胜佛美猴王  阅读(704)  评论(0编辑  收藏  举报