OpenGL的常见专业名词解析

状态机

  • 可以理解为一台可以保存状态,并根据当前状态进行相应输出的机器,也可以理解为就是一种存在于理论中的机器;
  • 首先,它有记忆的能力,能够记住自己当前的状态。(电脑的存储器(内存、硬盘等),可以记住电脑自己当前的状态(当前安装在电脑中的软件、保存在电脑中的数据,其实都是二进制的值,都属于当前的状态),状态机就相当于这里的电脑,类似于这样的“存储记忆”,因而OpenGL可以记录自己的状态(比如:当前所使用的颜色、是否开启了混合功能等,这些都是要记录的));
  • 其次,它可以接收输入,根据用户输入的内容和自己的状态,修改自己的状态,并且可以得到输出。(电脑的输入设备接收输入(键盘输入、鼠标输入、文件输入),根据输入的内容和自己的状态(主要指可以运行的程序代码),修改自己的状态(修改内存中的值),并且可以得到输出(将结果显示到屏幕),OpenGL和电脑类似,也可以接收输入(当调用OpenGL函数的时候,可以看成OpenGL在接收输入),根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出(比如当调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;当调用glRectf,则OpenGL会输出一个矩形));
  • 最后,当它进入某个特殊的状态(停机状态)的时候,它不再接收输入,停止工作。(类似于电脑关机之后,便不再接收信息,停止工作);

上下文 Context

  • 保存OpenGL中各种状态的一个庞大状态机,记录OpenGL渲染需要的所有信息,它是一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多的使用OpenGL函数调用设置的状态和状态属性;
  • OpenGL指令执⾏的基础,比如保存了一系列的变量用来描述OpenGL此刻需要如何运行,比如拍照时候要开启滤镜功能等等;
  • 应用程序中可以创建多个不同的上下文,分别在各自的线程中使用。上下文之间共享纹理,缓冲区等资源,采用这中方案更为高效,因为它避免了反复切换上下文,或者大量修改渲染状态所造成的较大的开销;

渲染(Rendering)

  • 在OpenGL中,所有东西都在一个3D的空间里,而屏幕和窗口都是2D的,所以OpenGL需要将3D的坐标转换成2D的坐标,这就是渲染(包括第一部分将3D坐标转换成2D坐标;第二部分把2D的坐标转换成实际的像素);

顶点数组 VertexArray、顶点缓冲区 VertexBuffer

  • 常量顶点属性对于一个图元的所有顶点都相同,所以对一个图元的所有顶点只需指定一个值;
  • 顶点数组指定每个顶点的属性 ,是保存在应用程序的地址空间 (OpenGL ES 称为客户空间) 的缓冲区,常在内存中;
  • 顶点缓冲区(VertexBuffer)用于保存一个或多个图元的索引,常在缓存中;初始化或者更新 缓冲区对象数据存储之后,客户数据存储不再需要的,静态的几何图形可以释放客户数据存储,减少应用程序消耗的内存;

管线

  • 管线包含一系列处理阶段,定点数据和像素数据进入管线进行处理,最后组合到一起写入帧缓冲区;
  • 渲染的过程就相当于管线,类似于生产流水线;
  • 主要分为固定管线(类似于API,只是参数的不同)和可编程管线(GLSL语法来驱使GPU);

着色器

  • 用来处理顶点相关代码的程序,主要作用于GPU(一个着色器类似于一个函数或者方法,但函数和方法是作用于CPU);
  • 固定着色器:固定封装的API代码段,只是需要的参数不同;
  • 顶点着色器:将顶点坐标由自身坐标系转换到归一坐标系,是逐顶点运行的程序,即每个顶点数据都会执行一次,确定其位置;主要用来处理图形顶点的变换(旋转、平移、缩放),3D图形数据投影换算 为2D图形数据等;
  • 片元着色器:主要用于处理一个个的像素点,逐像素且在GPU并行运算,即每个像素都会执行一次;
  • 自定义着色器:进行自定义编译的代码片段;

GLSL

  • GLSL着色语⾔是⽤来在OpenGL中着⾊编程的语⾔,是在图形卡的GPU上执⾏的,代替了固定的渲染管线的⼀部分,使渲染管线中不同层次具有可编程性;

光栅化

  • 光栅化是将图元转化为一组二维片段的过程:当渲染一个图元时,光栅化(Rasterization)阶段通常会造成比原指定顶点更多的片段。它会根据每个片段在图元上所处相对位置决定这些片段的位置。基于这些位置,它会插值(Interpolate)所有片段着色器的输入变量;
  • 包含了两部分的⼯作:一是决定窗⼝坐标中的哪些整型栅格区域被基本图元占⽤,二是分配一个颜⾊值和⼀个深度值到各个区域;
  • 几何图元转化为二维图像,把物体的数学描述和相关的颜色信息转换为屏幕上对应位置的像素及填充像素颜色,将模拟信号转换为离散信号;

纹理(Texture、位图)

  • 纹理可以理解为是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;需要将png转换成位图,所以纹理又是位图;
  • 纹理也可以被用来储存大量的数据,可以发送到着色器上;
  • 将平时的jpg/png图片转换成位图,位图即为纹理;

混合(Blending)

  • 为了渲染出不同的透明度级别,需要开启混合;
  • 可以理解为图层叠加的计算;

变换矩阵 (Transformation)

  • 用于图形的平移、旋转、缩放时使用;

投影矩阵 (Projection)

  • 将3D坐标转换为2D屏幕坐标时使用;

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

  • 渲染缓冲区:可以理解为是系统的资源,例如窗口;
  • 渲染上屏:将图像直接渲染到窗口对应的渲染缓冲区;
  • 显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区;在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上显示;
  • 为防⽌交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进⾏交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步;
  • 在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利⽤硬件性能的⽬的。

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/107096916