美文网首页
Open GL 固定管线编程

Open GL 固定管线编程

作者: jasperWhf | 来源:发表于2020-03-23 17:24 被阅读0次

    固定管线编程是通过集合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();

    }

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

    相关文章

      网友评论

          本文标题:Open GL 固定管线编程

          本文链接:https://www.haomeiwen.com/subject/fgiwyhtx.html