美文网首页
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