OpenGL简单图形的绘制

121 阅读2分钟

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();

至次完成绘制。