OpenGL图形绘制在固定管线下基本上可以分为以下下几步:
初始化窗口相关
1、初始化视口
glViewport(0, 0, w, h);
2、设置透视投影
(透视投影是将立体的左边转换为平面的显示效果,,如果只是一个平面的图形显示可以不设置。)
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 1000.0f);
3、获取投影矩阵,并放入矩阵堆栈
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
4、加载单元矩阵
modelViewMatrix.LoadIdentity();
初始化渲染相关
1、设置背景颜色
glClearColor(0.7f, 0.7f, 0.7f, 1.0f );
2、初始化管线管理
shaderManager.InitializeStockShaders();
3、开启深度测试
glEnable(GL_DEPTH_TEST);
4、设置变换管道管理模型矩阵和投影矩阵
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
5、初始化顶点数据
(圆柱体顶点数据)
int iCounter = 0;
//半径
GLfloat radius = 3.0f;
//从0度~360度,以0.3弧度为步长
for(GLfloat angle = 0.0f; angle <= (2.0f*M3D_PI); angle += 0.3f)
{
//或许圆形的顶点的X,Y
GLfloat x = radius * sin(angle);
GLfloat y = radius * cos(angle);
//绘制2个三角形(他们的x,y顶点一样,只是z点不一样)
vPoints[iCounter][0] = x;
vPoints[iCounter][1] = y;
vPoints[iCounter][2] = -0.5;
iCounter++;
vPoints[iCounter][0] = x;
vPoints[iCounter][1] = y;
vPoints[iCounter][2] = 0.5;
iCounter++;
}
// 关闭循环
//结束循环,在循环位置生成2个三角形
vPoints[iCounter][0] = vPoints[0][0];
vPoints[iCounter][1] = vPoints[0][1];
vPoints[iCounter][2] = -0.5;
iCounter++;
vPoints[iCounter][0] = vPoints[1][0];
vPoints[iCounter][1] = vPoints[1][1];
vPoints[iCounter][2] = 0.5;
iCounter++;
6、调用path类进行绘制
triangleStripBatch.Begin(GL_TRIANGLE_STRIP, iCounter);
triangleStripBatch.CopyVertexData3f(vPoints);
triangleStripBatch.End();
场景渲染
1、清除深度缓存在区,颜色缓存区等
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2、将观察者坐标系入栈
modelViewMatrix.PushMatrix();
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部 (便于状态的恢复)
modelViewMatrix.MultMatrix(mCamera);
3、将图形坐标系入栈
M3DMatrix44f mObjectFrame;
objectFrame.GetMatrix(mObjectFrame);
//矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部
modelViewMatrix.MultMatrix(mObjectFrame);
4、着色器调用
该方法调用为平面着色器
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
5、设置线条宽度
glLineWidth(2.0f);
6、开始绘制
triangleStripBatch.Draw();
7、还原对应的状态
glLineWidth(1.0f);
// 还原视图矩阵
modelViewMatrix.PopMatrix();
8、交换上下文
glutSwapBuffers();
至次完成绘制。