本案例主要是对常见的图元连接方式的运用,常见图元连接方式见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栈顶,恢复原始状态