Open GL 固定管线编程

2020-03-23  本文已影响0人  jasperWhf

固定管线编程是通过集合Open Gl命令,执行图形API操作的通用命令集.

图形绘制流程:

程序可操作环节为,顶点着色器-->图元装配-->片源着色器-->渲染.所有的API操作围绕这几个环节配置.

1:配置视口

   视口是图形显示的范围,在程序入口中注册回调函数.

 //注册回调函数(改变尺寸)

    glutReshapeFunc(ChangeSize);

//API 调用如下

     void ChangeSize(int w, int h)

{

    glViewport(0,0, w, h);

    //创建投影矩阵,并将它载入投影矩阵堆栈中

    viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);

    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());

    //调用顶部载入单元矩阵

    modelViewMatrix.LoadIdentity();

}

2:设置顶点数据,初始化管线,配置Open Gl状态机参数

void SetupRC()

{

    // 灰色的背景

    glClearColor(0.7f, 0.7f, 0.7f, 1.0f );

    shaderManager.InitializeStockShaders();

    glEnable(GL_DEPTH_TEST);

    //设置变换管线以使用两个矩阵堆栈

    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);

    cameraFrame.MoveForward(-15.0f);

    /*

     常见函数:

     void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0);

      参数1:表示使用的图元

      参数2:顶点数

      参数3:纹理坐标(可选)

     //复制顶点坐标

     void GLBatch::CopyVertexData3f(GLFloat *vNorms);

     //结束,表示已经完成数据复制工作

     void GLBatch::End(void);

     */

    //定义一些点,三角形形状。

    GLfloatvCoast[9] = {

        3,3,0,0,3,0,3,0,0

    };

    //用点的形式

    pointBatch.Begin(GL_POINTS, 3);

    pointBatch.CopyVertexData3f(vCoast);

    pointBatch.End();

    //通过线的形式

    lineBatch.Begin(GL_LINES, 3);

    lineBatch.CopyVertexData3f(vCoast);

    lineBatch.End();

    //通过线段的形式

    lineStripBatch.Begin(GL_LINE_STRIP, 3);

    lineStripBatch.CopyVertexData3f(vCoast);

    lineStripBatch.End();

    //通过三角形创建金字塔

    GLfloatvPyramid[12][3] = {

        -2.0f,0.0f, -2.0f,

        2.0f,0.0f, -2.0f,

        0.0f,4.0f,0.0f,

        2.0f,0.0f, -2.0f,

        2.0f,0.0f,2.0f,

        0.0f,4.0f,0.0f,

        2.0f,0.0f,2.0f,

        -2.0f,0.0f,2.0f,

        0.0f,4.0f,0.0f,

        -2.0f,0.0f,2.0f,

        -2.0f,0.0f, -2.0f,

        0.0f,4.0f,0.0f};

    triangleBatch.Begin(GL_TRIANGLES, 12);

    triangleBatch.CopyVertexData3f(vPyramid);

    triangleBatch.End();

}

3:渲染

void RenderScene()

{

     // Clear the window with current clearing color

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

     //压栈

     modelViewMatrix.PushMatrix();

     M3DMatrix44fmCamera;

     cameraFrame.GetCameraMatrix(mCamera);

     //矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部

     modelViewMatrix.MultMatrix(mCamera);

     M3DMatrix44fmObjectFrame;

     //只要使用 GetMatrix 函数就可以获取矩阵堆栈顶部的值,这个函数可以进行2次重载。用来使用GLShaderManager 的使用。或者是获取顶部矩阵的顶点副本数据

     objectFrame.GetMatrix(mObjectFrame);

     //矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部

     modelViewMatrix.MultMatrix(mObjectFrame);

     /* GLShaderManager 中的Uniform 值——平面着色器

      参数1:平面着色器

      参数2:运行为几何图形变换指定一个 4 * 4变换矩阵

      --transformPipeline.GetModelViewProjectionMatrix() 获取的

      GetMatrix函数就可以获得矩阵堆栈顶部的值

      参数3:颜色值(黑色)

      */

     shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);

     switch(nStep) {

         case0:

             //设置点的大小

             glPointSize(4.0f);

             pointBatch.Draw();

             glPointSize(1.0f);

             break;

         case1:

             //设置线的宽度

             glLineWidth(2.0f);

             lineBatch.Draw();

             glLineWidth(1.0f);

             break;

         case2:

             glLineWidth(2.0f);

             lineStripBatch.Draw();

             glLineWidth(1.0f);

             break;

         case3:

             glLineWidth(2.0f);

             lineLoopBatch.Draw();

             glLineWidth(1.0f);

             break;

         case4:

             DrawWireFramedBatch(&triangleBatch);

             break;

     }

     //还原到以前的模型视图矩阵(单位矩阵)

     modelViewMatrix.PopMatrix();

     // 进行缓冲区交换

     glutSwapBuffers();

}

简练的固定管线编程初探结束!

上一篇下一篇

猜你喜欢

热点阅读