OpenGL 绘制金字塔、圆环、六边形

绘制流程

最终实现效果如下图:

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在它的文末有,我这里就不提供了,再次感谢原作者。谢谢。

你可能感兴趣的:(OpenGL 绘制金字塔、圆环、六边形)