在开始做OpenGL的时候我们经常会很难记住绘制的流程,因此我今天总结入下:
所用到的变量声明如下:
1.着色器管理者
GLShaderManager shaderManager;
2.模型矩阵堆栈
GLMatrixStack modelViewMatrix;
3.投影矩阵堆栈
GLMatrixStack projectionMatrix;
4.视景体 :用来构造投影矩阵
GLFrustum viewFrustum;
5.观察者位置
GLFrame cameraFrame;
6.世界坐标位置
GLFrame objectFrame;
7.几何变换管道,用于存储和获取模型和投影矩阵堆栈
GLGeometryTransform transformPipeline;
8.三角形批次类 torusBatch这个暂时用来绘制甜甜圈
GLTriangleBatch torusBatch;
一、第一步设置SetupRC();
setupRC()是第一步操作,相当于我们写代码的时候的初始化过程。
在此步骤中进行的操作如下:
1.设置背景色
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
2.初始化着色器管理者
shaderManager.InitializeStockShaders();
3.将观察者位置调整到视图之外,方便观看
cameraFrame.MoveForward(-15);
4.创建几何图形 甜甜圈
gltMakeTorus(torusBatch, 1.0f, 0.3f, 52, 26);
二、第二步ChangeSize(int w, int h);
当视图第一次出现和窗口改变都会调用此方法: 此方法主要是为了设置视口大小和设置模型和投影的矩阵堆栈
1.设置视口大小
glViewport(0,0, w, h);
2.设置视景体,目的是通过视景体得到投影矩阵堆栈
viewFrustum.SetPerspective(35, floorf(w)/floorf(h), 2, 20);
3.得到投影矩阵堆栈
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
4.设置模型矩阵堆栈 比如加载单元矩阵
modelViewMatrix.LoadIdentity();
5.把投影矩阵堆栈和模型矩阵堆栈放到几何变换中
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
三、第三步RenderScence(void); 召唤场景
每次绘制系统都会调用此方法
1.清空缓冲区 颜色、深度、模板缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPATCH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2.把模型矩阵进行压栈(压栈到世界坐标系)处理,做这步的目的是为了绘制好几个图形,所以要进行压栈和出栈
modelViewMatrix.PushMatrix(objectFrame);
3.通过着色器管理器通过固定管线绘制
GLT_SHADER_FLAT 平面着色器
transformPipeline.GetModelViewProjectionMatrix() MVP
vGreen 绘制的颜色
shaderManager.UseStockShader(GL_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);
4.开始绘制
torusBatch.Draw();
5.出栈
modelViewMatrix.PopMatrix();
6.交换缓冲区进行渲染
glutSwapBuffers();
最终结果如下图:

网友评论