OpenGL入门 -- 案例03:金字塔、六边形、圆环的绘制

564 阅读2分钟

本案例主要是对常见的图元连接方式的运用,常见图元连接方式见OpenGL的投影方式、固定着色器分类以及图元连接方式

最终效果:

整体流程图如下:

主要函数说明:

  • Mian函数:函数入口
  • ChangeSize函数:设置视口和投影方式
  • SetupRC函数:顶点数据及图元连接方式
  • RenderScene函数:图形绘制
  • SpecialKeys函数:注册特殊键位的回调函数
  • KeyPressFunc函数:注册空格键回调
  • DrawWireFrameBatch函数:立体图形绘制以及描边

ChangeSize函数

  • 设置投影方式
/*
参数1:垂直方向上的视场角度
参数2:视口纵横比 = w/h
参数3:近裁剪面距离
参数4:远裁剪面距离
*/
viewFrustum.SetPerspective(35.0f, floor(w)/floor(h), 1.0f, 500.0f);
  • 根据设置的投影方式获得投影矩阵
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
  • 初始化模型视图矩阵堆栈,压栈一个单元矩阵
modelViewMatrix.LoadIdentity();

SetupRC函数

SetupRC函数除了一些基本的设置之外,还要对矩阵和观察者进行设置

  • 将模型视图矩阵和投影矩阵放到变换管道中,进行矩阵变换相乘,在RenderScene函数中可直接通过变换管道的Get方法,得到相应的矩阵。
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
方法 说明
GetProjectionMatrix() 投影矩阵
GetNormalMatrix() 法线矩阵
GetModelViewMatrix() 模型视图矩阵(MV)
GetModelViewProjectionMatrix() 模型视图投影矩阵(MVP)
  • 设置观察者位置
cameraFrame.MoveForward(-15.0f);
方法 说明
void MoveForward(float fDelta) 向外移动的像素点,修改z
void MoveUp(float fDelta) 向上移动的像素点,修改y
void MoveRight(float fDelta) 向右移动的像素点,修改x

RenderScene函数

主要流程如下:

压栈流程如下:

  • ChangeSize函数中,通过LoadIdentity(),初始化一个单元矩阵
  • RenderScene函数中,压栈一个单元矩阵,为了图形绘制完成后,矩阵的复原,此时,矩阵栈中有两个单元矩阵
modelViewMatrix.PushMatrix();
  • 构建观察者矩阵,取出栈顶元素,与观察者矩阵相乘,结果重新压栈
// 构建观察者矩阵
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
    
// 矩阵相乘,结果存到矩阵堆栈的顶部
// 栈顶单元矩阵 *  mCameram  = newCamera
    modelViewMatrix.MultMatrix(mCamera);
  • 构建物体矩阵,取出栈顶元素,与物体矩阵相乘,结果重新压栈
// 物体矩阵
M3DMatrix44f mObjectFrame;
objectFrame.GetMatrix(mObjectFrame);
    
// 矩阵相乘,放到模型视图矩阵,结果存到矩阵堆栈的顶部
// newCamera * mObjectFrame
modelViewMatrix.MultMatrix(mObjectFrame);
  • 利用固定管线渲染图形,渲染完成后,Pop栈顶,恢复原始状态

具体完整代码见GitHub