美文网首页
OpenGL学习--基础学习

OpenGL学习--基础学习

作者: Harry_upup | 来源:发表于2019-05-16 18:30 被阅读0次

    首先知道OpenGL/OpenGL ES/Metal 都是利用GPU芯片高效渲染图形图像,图形API 是iOS开发者唯⼀一接近GPU的方式。

    专业名词理解

    • OpenGL上下文 context

    1、在应用程序调⽤用任何OpenGL的指令之前,需要⾸先创建一个OpenGL的上下文,这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执⾏的基础。
    2、对OpenGL上下⽂这个庞大的状态机中的某个状态或者对象进⾏操作,你得首先把这个对象设置为当前对象。因此,通过对 OpenGL指令的封装,是可以将OpenGL的相关调用封装成为⼀个面向对象的图形API。
    3、由于OpenGL上下文是⼀个巨⼤的状态机,切换上下文往往会产⽣较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中分别创建多个不同的上下文,在不同线程中使用不同的上下文,上下文之间共享纹理、缓冲区等资源。这样的方案,会比反复切换上下⽂,或者大量修改渲染状态,更加合理高效。

    • 状态机
      理论上的一种机器,描述对象在生命周期内经历的各种状态。

    有记忆功能,能记住当前的状态;
    可以接收输入,根据输入的内容和原先的状态来修改当前状态,并且可以有对应输出;
    当进入特殊状态(停机状态)的时候,不接收输入,停止工作;

    • OpenGL状态机
      通过上面的描述,类推到OpenGL

    OpenGL可以记录自己的状态(比如当前使用的颜色、是否开启了混合功能等);
    OpenGL可以接收输入(调用OpenGL函数的时候,可以看出OpenGL在接收我们的输入),如调用glColor3f,则OpenGL接收到这个输入后会修改自己的当前颜色的状态;
    OpenGL进入停止状态,不在接收输入;

    • 渲染

    将图形或图像数据转换成3D空间图像的操作就是渲染

    • 顶点数组、顶点缓冲区

    画图一般是先画好骨架,然后往骨架里面填充颜色,OpenGL也一样。 顶点数据就是图像的骨架,OpenGL中的图像是图元组成,有3中类型的图元:点、线、三角形。在调用绘制方法的时候,由内存传入顶点数据,这些数据之前是存储在内存当中,称为顶点数组。性能更高的做法是,提前分配一块显存,将顶点数据先传入到显存当中。这部分的显存,就是顶点缓冲区

    • 管线

    是一个抽象概念,类似于工厂加工流水线。显卡在处理数据的时候按照一个固定的顺序执行,就像水从一根管子的一端流到另一端,顺序不能打破。

    • 固定管线/存储着色器

    就是封装了很多着色器功能的固定shader程序来帮助开发者完成渲染,开发者只需要传入相应的参数就可以,类似于iOS封装的API,只需要调用,不用关心底层实现。
    固定管线或存储着色器无法完成业务是,可将相关部分开放成可编程。

    • 着色器程序 Shader

    OpenGL在实际调用绘制函数之前,需要指定一个由shander编译成的着色器程序。常见的着色器有顶点着色器片元着色器、几何着色器、细分着色器。到OpenGLES 3.0,依然只支持了顶点着色器和片元着色器;
    OpenGL在处理shader时,和其他编译器一样。通过编译、链接等步骤,⽣成了着色器程序(glProgram),着色器程序同时包含了顶点着色器和片元着色器的运算逻辑。在OpenGL进⾏绘制的时候,⾸先由顶点着⾊器对传入 的顶点数据进⾏运算。再通过图元装配,将顶点转换为图元。然后进⾏光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传⼊片段着⾊器中进⾏运算。⽚元着色器会对栅格化数据中的每一个像素进⾏运算,并决定像素的颜⾊。

    • 顶点着色器 VertexShader

    用来处理图形每个顶点的变换(旋转/平移/投影等),逐个顶点运行,有几个顶点就运行几次,是并行的,顶点着色器运算过程中无法访问其他顶点的数据;
    一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由自身坐标系转换到归⼀化坐标系的运算,就是在这里发生的。

    • 片元着色器 FragmentShader

    用来处理图形中每个像素点的颜色计算和填充,逐像素预算,每个像素都是执行一次片元着色器。

    • GLSL (OpenGL Shading Language)

    OpenGL着色语言,是OpenGL中着色编程的语言,在GPU上执行,是渲染管线中不同层次具有可编程性。

    • 光栅化(Rasterization)

    把顶点数据转换成片元的过程,片元中的每一个像素对应帧缓存区中的一个像素;
    光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分⼯作:分配一个颜色值和一个深度值到各个区域。光栅化过程产⽣的是片元。

    • 混合(Blending)

    混合指的是颜色混合,当开启混合功能之后,如果像素没有被剔除,那么像素的颜色将和帧缓冲的颜色进行混合。

    • 变换矩阵(Transformatio)投影矩阵(Projection)

    变换矩阵:图形想发生平移、缩放、旋转等变换,就需要变换矩阵;
    投影矩阵:把3D坐标转换为二维屏幕坐标。

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

    常规的OpenGL程序⾄少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕的显示。(简单来说就是离屏缓冲区渲染后和屏幕缓冲区交换,由屏幕缓冲区显示在屏幕上)。

    • image
      image.png

    相关文章

      网友评论

          本文标题:OpenGL学习--基础学习

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