美文网首页视觉学习
OpenGL-基本图元绘制(案例分析)

OpenGL-基本图元绘制(案例分析)

作者: 一代千禧 | 来源:发表于2020-07-10 15:58 被阅读0次

    案例效果先摆上Demo的github地址

    案例效果图

    三大函数

    1、ChangeSize函数:主要是设置视口及投影方式,当视口发生变化当时候时会调用

    案例中设置视口代码示例:

    glViewport(0, 0, w, h);
    

    案例中设置投影方式代码示例:

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

    案例中完整代码

    // 使用窗口维度设置视口和投影矩阵.
    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、SetupRC函数:初始化函数,图形数据配置,主要是顶点数据及图元连接方式

    // 此函数在呈现上下文中进行任何必要的初始化。.
    // 这是第一次做任何与opengl相关的任务。
    void SetupRC()
    {
        // 灰色的背景
        glClearColor(0.5f, 0.7f, 0.5f, 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);
         
         */
        //定义一些点,三角形形状。
       
        GLfloat vCoast[9] = {
            3,3,0,0,3,0,3,0,0
        };
        //用点的形式
        pointBatch.Begin(GL_POINTS, 3);
        pointBatch.CopyVertexData3f(vCoast);
        pointBatch.End();
    }
    

    案例主要完成以下几点内容:
    1、设置背景颜色
    2、初始化着色器
    3、开启深度测试开关
    4、设置变换管线以使用两个矩阵堆栈
    5、设置观察者位置
    6、顶点数据创建和传输

    3、RenderScene函数:主要用于图形的绘制,可以系统触发,也可以开发者手动触发,工作流程如下:

    渲染流程图

    示例代码如下:

    void RenderScene(void)
    {
        // Clear the window with current clearing color
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
       
        //压栈
        modelViewMatrix.PushMatrix();
        M3DMatrix44f mCamera;
        cameraFrame.GetCameraMatrix(mCamera);
        
        //矩阵乘以矩阵堆栈的顶部矩阵,相乘的结果随后简存储在堆栈的顶部
        modelViewMatrix.MultMatrix(mCamera);
        
        M3DMatrix44f mObjectFrame;
        //只要使用 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);
    
        //设置点的大小
        glPointSize(4.0f);
        pointBatch.Draw();
        glPointSize(1.0f);
    
        //还原到以前的模型视图矩阵(单位矩阵)
        modelViewMatrix.PopMatrix();
        
        // 进行缓冲区交换
        glutSwapBuffers();
    }
    

    矩阵在堆栈中情况如下:


    堆栈变化情况

    相关文章

      网友评论

        本文标题:OpenGL-基本图元绘制(案例分析)

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