美文网首页
OpenGL-专业名词解析

OpenGL-专业名词解析

作者: Tobesky | 来源:发表于2019-05-12 17:01 被阅读0次

    模型/场景对象

    • 模型或者场景对象(这两个名词是一个意思)是通过几何图元,例如点,线和三角形来构建的
    • 图元与模型的顶点(vertex)存在着各种对应关系

    渲染(render)

    • 它标识计算机从模型创建最终图像的过程

    图形/图像数据 => 3D空间图像

    • OpenGL是基于光栅化的系统来生成图像(会在下一篇内容有介绍)

    渲染上屏/交换缓冲区(SwapBuffer)

    • 渲染缓冲区一般映射系统资源(比如将图像渲染到窗口对应渲染缓冲区,则直接可以屏幕上看到图像)
    • 每个窗口只有一个缓冲区,那就会带来一些可能的问题,比如在图像绘制过程中屏幕进行了刷新,那图像可能没办法完整显示出来
    • 为了解决上面的问题,OpenGL至少会有连个缓冲区,屏幕缓冲区和离屏缓冲区(顾名思义),这样可以通过缓冲区之间的交换来实现图像在屏幕上的显示
    • 垂直同步:刷新是逐行进行的,那为了防止交换缓冲区时屏幕屏幕上下区域属于不同的帧,交换一般会等待显示器刷新完的信号,也就是在其刷新的间隔进行交换,这个信号叫做垂直同步信号,这个技术叫做垂直同步
    • 三缓冲区技术:原理同上,只是引入该技术后可以做到,在等待垂直同步时,可以来回交替渲染两个离屏缓冲区,而在垂直同步发生时,可以在屏幕缓冲区和最近渲染完成的离屏缓冲区交换,从而最大化利用硬件性能
    • glFlush 强制刷新
    • glutSwapBuffers 交换缓冲区

    管线

    • 管线的概念
      管线(pipeline),可以理解为渲染流水线。管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程的管理。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

    • 固定管线(存储着色器)
      可以简单理解为渲染图像的这个过程,我们只能通过调用GLShaderManager类的固定管线效果实现我们一系列的着色器处理。

    • 可编程管线
      可以简单理解, 在我们处理图形的过程,我们必须使用顶点着色器片元着色器过程。我们可以采用GLSL自行编写着色器程序,来执行这个过程的事情。


    着色器

    着色器是OpenGL最本质的概念,理解它最好的方法是把它看做是一种小型程序,用它来编译图形处理单元(即GPU)。

    • 它是图形硬件设备执行的一类特殊函数
    • OpenGL内部包含了所有的编译器工具,可以直接从着色器代码创建GPU所需的编译代码并执行。
    • OpenGL会用到四中着色阶段(shader stage),最常用的是顶点着色器片元着色器
    • 顶点着色器
      用于处理顶点数据
    • 片元/片段/像素着色器
      用于处理光栅化的片元数据

    所有的OpenGL程序都需要用到这两类着色器

    着色器就是控制GPU来进行计算的
    ps:Metal里面叫片元函数


    GLSL(OpenGL Shading Language)

    OpenGL着色语言(OpenGL Shading Language)是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片元着色器),有时还会有Geometry Shader(几何着色器)。


    纹理

    纹理,英文是texture,中文可以翻译成纹理、纹理图、纹理映射等等一堆东西。不过不管翻译成啥,讲的都是一个东西。我们通常说的纹理,指的是一张二维的图片,把它像贴纸一样贴在什么东西上面,让那个东西看起来像我们贴纸所要表现的东西那样。

    有关纹理的详细介绍可以参照这篇文章

    用一句话来总结,纹理就是一张贴到物体上的2维图像


    变换矩阵(Transformation)

    图形想发生平移,缩放,旋转变换,就需要使用变换矩阵。

    / 加载单位矩阵
    void m3dLoadIdentity44(M3DMatrix44f m);
    // 沿着 x/y/z 轴平移
    void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z);
    // 沿着 x/y/z 轴旋转 angle(弧度)
    void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z);
    // 在 x/y/z 轴上进行缩放
    void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale);
    // 矩阵 a 和矩阵 b 相乘得到矩阵 product
    void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const  M3DMatrix44f b);
    

    投影矩阵(Projection)

    用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下绘制

    • 设置投影矩阵是通过视景体(GLFrustum)来设置的
    [GLFrustum] { // 仅仅表示以下方法是 GLFrustum 的方法
        // 设置正投影矩阵参数,(x, y, z)最小和最大值
        void SetOrthographic(GLfloat xMin, GLfloat xMax, 
                             GLfloat yMin, GLfloat yMax, 
                             GLfloat zMin, GLfloat zMax);
        // 设置透视投影矩阵参数,分别为:透视角,宽高比,近距,远距
        void SetPerspective(float fFov, float fAspect, float fNear, float fFar);
        // 获取投影矩阵
        const M3DMatrix44f& GetProjectionMatrix(void);
    }
    
    • 为了方便管理各个矩阵,GLTools 提供了矩阵堆栈 GLMatrixStack,默认堆栈最大深度为 64,有压栈、出栈等操作。
    [GLMatrixStack] { // 仅仅表示以下方法是 GLMatrixStack 的方法
        // -------- 矩阵加载 -----------
        // 在栈顶载入单元矩阵,载入即覆盖
        void LoadIdentity(void);
        // 在栈顶载入任何矩阵
        void LoadMatrix(const M3DMatrix44f m);
        // 用栈顶矩阵乘以某个矩阵,得到的结果矩阵覆盖原来的栈顶矩阵
        void MultMatrix(const M3DMatrix44f mMatrix);
        // 获取栈顶矩阵
        const M3DMatrix44f& GetMatrix(void);
        // -------- 出栈压栈 -----------
        // 压栈,在栈顶压入一个矩阵
        void PushMatrix(const M3DMatrix44f mMatrix);
        // 出栈,把栈顶矩阵移除矩阵堆栈
        void PopMatrix(void);
        // -------- 仿射变换 -----------
        // 栈顶矩阵进行缩放变换
        void Scale(GLfloat x, GLfloat y, GLfloat z);
        // 栈顶矩阵进行平移变换
        void Translate(GLfloat x, GLfloat y, GLfloat z);
        // 栈顶矩阵进行旋转变换
        void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    }
    

    有关像素

    像素(pixel)是显示器上最小的可见单元。

    • 计算机系统将所有的像素保存到帧缓存(framebuffer)
    • 帧缓存
      它是由图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。

    相关文章

      网友评论

          本文标题:OpenGL-专业名词解析

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