美文网首页
OpenGL03 — 金字塔、六边形、圆环的绘制

OpenGL03 — 金字塔、六边形、圆环的绘制

作者: 土豆骑士 | 来源:发表于2021-01-16 22:55 被阅读0次

    01:基础了解

    投影方式:正投影2D,透视投影3D

    存储着色器分类

    单元着色器、平面着色器 、上着色器、默认光源着色器、点光源着色器、纹理替换矩阵着色器、纹理调整着色器、纹理光源着色器。

    常见图元连接方式:

    最受欢迎的是三角形

    点GL_POINTS、线GL_LINE、线段GL_LINE_STRIP、线环GL_LINE_LOOP、三角形GL_TRIANGLES、三角形带GL_TRIANGLES_STRIP、三角形扇GL_TRIANGLES_FAN

    三角形环绕方式

    OPenGL中默认具有逆时针环绕方向的多边形为正面,可修改。

    三角形带的优势

    1:第一个三角形用了3个顶点之后,对于往后的三角形,每次只需再指定一个顶点,即可构成三角形。当需要绘制大量三角形时,一是可以复用,而是可以节省存储空间。
    2:提高运算性能和节省宽带,更少的顶点使数据从内存传输到顶点着色器的速度更快,顶点着色器中顶点处理的次数也更少了。

    了解OPenGL中的投影方式、存储着色器分类、常见图元连接方式 ==》详细参考这位美女:链接

    02:案例,六边形,圆环,金字塔绘制

    大体流程:

    • main函数:程序入口
    • ChangeSize函数:设置视口 投影方式
    • SetupRC函数:图形数据配置,主要是顶点数据及图元连接方式
    • RenderScene函数:主要用于图形的绘制,可以系统触发,也可以手动触发
    • SpecialKeys函数:对特殊键位的回调处理
    • KeyPressFunc函数:针对空格键的回调处理
    • DrawWireFrameBatch函数:用于立体图形填充及边框绘制
      PS:图片来自 Style_月月大神
      图案绘制大体流程
    主要函数解析

    1:ChangeSize函数

    主要用来设置视图大小以及当视口发生变化时调用的函数,本案例中立体图形的绘制,需要使用投影矩阵 因此需要在该函数中设置投影矩阵主要及以下步骤:

    • 设置图形投影的方式:因为是立体图形,所以选择透视投影
    //参数1:垂直方向上的视场角度
    //参数2:视口纵横比 = w/h
    //参数3:近裁剪面距离
    //参数4:远裁剪面距离
    viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 500.0f);
    
    • 通过设置的投影方式获得投影矩阵,并将其存入投影矩阵中
    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    
    • 初始化模型视图矩阵堆栈,压入一个单元矩阵
    modelViewMatrix.LoadIdentity();
    

    2:SetupRC函数

    从流程图上可以看出,除了基本的背景色设置,存储着色器初始化以及顶点数据的创建传输外,还需要对矩阵及观察者做一下设置。

    • 将模型视图矩阵和投影矩阵放到变换管道中,变换管道的作用是能帮助快速进行矩阵想乘,在RendScene函数中可以直接通过变换管道的Get方法得到相应的矩阵。
    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
    

    其中,变换管道通过get可获得矩阵有4种

    方法 说明
    GetProjectionMatrix() 投影矩阵
    GetNormalMatrix() 法线矩阵
    GetModelViewMatrix() 模型视图矩阵,简称 mv
    GetModelViewProjectionMatrix() 模型视图投影矩阵,简称 mvp

    设置观察者位置

    cameraFrame.MoveForward(-15.0f);
    

    观察者位置的设置有3种

    方法 说明
    void MoveForward(float fDelta) 向外移动的像素点,修改z
    void MoveUp(float fDelta) 向上移动的像素点,修改y
    void MoveRight(float fDelta) 向右移动的像素点,修改x

    3:RenderScene函数

    其流程如下,主要是立体图形的渲染过程:

    1:清理缓存区
    2: 模型矩阵中push一个单元矩阵(目前栈中有两个单元矩阵,目的:在绘制完成图形后可以还原矩阵)
    3:利用mCameraFrame构建观察者矩阵
    4:栈顶单元矩阵观察者矩阵 = 新观察者矩阵,将新观察者矩阵压栈
    5:利用mObjectFrame构建物体矩阵
    6:栈顶观察者矩阵
    物体矩阵 = 模型视图矩阵,将模型视图矩阵压栈
    7:设置存储着色器类型(平面着色器)
    8:绘制图形 ——》 绘制完毕,还原矩阵(模型视图矩阵pop出栈)

    这个过程是将物体坐标转化为裁剪坐标,然后经过OpenGL的处理,转换为NDC,并显示到屏幕上的一个过程。其栈变化如下


    栈中变化过程
    • ChangeSize函数中向栈中初始化了一个单元矩阵
    • RenderScene函数中再次向栈中压入了一个单元矩阵:主要是为了图形绘制完成后,矩阵的复原,所以栈中有两个单元矩阵
    modelViewMatrix.PushMatrix();
    
    • 将cameraFrame构建为观察者矩阵,将栈顶单元矩阵取出,与观察者矩阵相乘,得到新的观察者矩阵,再将其入栈
    M3DMatrix44f mCamera;
    cameraFrame.GetCameraMatrix(mCamera);
    modelViewMatrix.MultMatrix(mCamera);
    
    • 将objectFrame构建为物体矩阵,取出栈顶的观察者矩阵,与物体矩阵相乘,得到模型视图矩阵,并将其入栈
    • 然后利用固定管线渲染图形,在图像渲染后,将栈中模型视图矩阵pop,恢复其初始状态。

    相关文章

      网友评论

          本文标题:OpenGL03 — 金字塔、六边形、圆环的绘制

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