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,恢复其初始状态
网友评论