绘制流程
最终实现效果如下图:
image
接下来我们来看看OpenGL绘制这些图形的具体流程。
未命名
整个流程大概涉及到了下面几个函数:
- main:负责初始化环境变量、注册回调函数、开始mainloop循环。
- SetupRC:负责设置背景颜色、初始化存储着色器管理类。
- ChangeSize:负责设置视口的大小,创建投影矩阵。
- RenderScene:用于具体图形的绘制。
- SpecialKeys:对键盘键位的回调处理。
- KeyPressFunc:针对空格键位的处理。
SetupRC
除了要对最基本的背景颜色以及存储着色器的初始化之外,我们还需要设置一个矩阵堆栈和一个观察者。
设置矩阵
将模型视图矩阵和投影矩阵放入变换管道中。变换管道的作用是能帮助快速进行矩阵相乘,在RenderScene函数中可以直接通过变换管道的Get方法得到相应的矩阵
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
设置观察者位置
cameraFrame.MoveForward(-15.0f);
ChangeSize
在这里它主要负责以下几件事情。
-
设置视口的大小。
glViewport(0, 0, w, h); -
创建投影矩阵
viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f); -
将投影矩阵载入到投影矩阵的堆栈中。
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix()); -
初始化模型视图矩阵堆栈,并压如一个单元矩阵
modelViewMatrix.LoadIdentity();
RenderScene
RenderScene函数可以由系统自动触发,也可以由开发者手动触发。它主要负责处理一下几件事情。
- 清理缓存区(颜色、深度、模板缓存区等)。
- 在模型视图矩阵中push进去一个单元矩阵。
- 创建一个观察者矩阵mCamera。
- 将模型视图矩阵栈顶的矩阵和观察者矩阵相乘,生成新的矩阵。将结果存储在堆栈的顶部。
- 构建新的物体矩阵mObjectFrame。
- 将模型视图矩阵的栈顶矩阵和mObjectFrame相乘获得新的矩阵,顶存储在栈顶。
- 设置平面着色器。
- 绘制图形。
- 绘制完毕,pop模型视图矩阵到原始状态。
- 交换缓冲区。
整个进出栈的流程如下图所示:
2251862-f6d135374581a79b
参考文献
本文参考了Style_月月的文章,具体的Demo在它的文末有,我这里就不提供了,再次感谢原作者。谢谢。














网友评论