美文网首页
OpenGL绘制

OpenGL绘制

作者: 吕建雄 | 来源:发表于2020-07-10 13:21 被阅读0次

    OpenGL绘制流程

    绘制流程

    上图右侧为初始化准备阶段,左侧为mainLoop监控到相关事件后,进行的回调;

    main:程序入口

    SetupRC:自定义函数(调用一次,来做OpenGL初始化) 设置需要渲染图形的相关顶点数据/颜色数据等数据装备工作,图元连接方式

    ChangeSize:通过glutReShaperFunc 注册为重塑函数, 当屏幕大小发生变化/或者第一次创建窗口时,会调用该函数调整窗口大小/视口大小

    RenderScene:通过glutDisplayFunc 注册为显示渲染函数,当屏幕发生变化/或者开发者主动渲染会调用此函数,用来实现数据->渲染过程 (可自动也可手动触发)

    SpecialKeys:通过glutSpecialFunc 注册为特殊键盘处理函数

    KeyPressFunc:通过glutKeyboardFunc 针对空格键的处理函数

    DrawWireFrameBatch:用于立体图形的填充及边框绘制

    相关函数详解

    ChangeSize函数

    触发条件:新建窗口、窗口尺寸发生调整

    处理业务:设置OpenGL视口,设置OpenGL投影方式等

    a.设置投影方式(3D图形,需要使用投影模型)

    //参数1:垂直方向上的视场角度

    //参数2:视口纵横比 = w/h

    //参数3:近裁剪面距离

    //参数4:远裁剪面距离

    viewFrustum.SetPerspective(35.0f,float(w)/float(h),1.0f,500.0f);

    b.加载投影矩阵 

    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());

    c.加载单元矩阵

    modelViewMatrix.LoadIdentity();

    投影矩阵、单元矩阵在设置变换管线时以使用两个矩阵堆栈

    SetupRC函数

    在SetUpRC中进行了基本的设置外,接下来还需要进入如下设置

    a.需要将模型视图矩阵和投影矩阵放到变换管道中,变换管道的作用是能帮助快速进行矩阵相乘,在RenderScene函数中可以直接通过变换管道的Get方法得到相应的矩阵

    transformPipeline.SetMatrixStacks(modelViewMatrix,projectionMatrix);

    矩阵获取

    b.设置观察者位置,或者物体位置(选择其中一种即可)

    cameraFrame.MoveForward(-15.0f);//观察者不动、移动物体

    objectFrame.MoveForward(15.0f);//物体不同,观察者动

    设置模式

    RenderScene函数

    工作流程

    关于压栈以及栈的作用

    栈的作用:(栈做什么用?记录一下状态(保持临时结果),进行撤回操作)

    在ChangeSize函数中向栈中初始化了一个单元矩阵,RenderScene函数中再次向栈中压入一个单元矩阵:主要是为了图形绘制完成后,矩阵的复原,所以此时栈中有两个单元矩阵;

    将cameraFrame构建为 观察者矩阵,将栈顶单元矩阵取出,与观察者矩阵相乘,得到新的观察者矩阵,再将其入栈

    将objectFrame构建为 物体矩阵,取出栈顶的观察者矩阵,与物体矩阵相乘,得到模型视图矩阵,并将其入栈

    然后利用固定管线渲染图形,在图像渲染完成后,将栈中模型视图矩阵pop,恢复其初始状态

    OpenGL绘制DEMO

    相关文章

      网友评论

          本文标题:OpenGL绘制

          本文链接:https://www.haomeiwen.com/subject/ufapcktx.html