OpenGL名词解释

buffer

一段连续的内存区域

data buffer

将本地图片*.jpg数据加载至内存,即data buffer。

它的大小和图片存储在磁盘中文件大小一致,但其数据并不直接描述像素(因为我们常用的图片数据本身就是压缩后的)。

image buffer

Image Buffers代表图片元数据Data Buffers在内存中被解码后的表示,每个元素代表一个像素点的颜色,即常说的位图。

其大小与Data Buffers大小成正比例。

framebuffer

Frame Buffer 存储了程序的每帧的实际渲染输出(actual rendered output)。GPU会根据Frame Buffer 的内容按一定帧率显示在屏幕上。

你可以这样理解,显示器刷新频率为60Hz,即GPU每16.6ms从framebuffer里面获取数据并显示在屏幕上。

Vertex

原指(三角形或锥形的)角顶、顶点、至高点,引申为OpenGL中的任一顶点。

绘制一个三角形,给定三个顶点,vertex程序将顶点坐标、纹理坐标传递给fragment程序

在传递时,系统会对顶点组成的区域进行插值,使其形成面。

fragment

原指片元,OpenGL中指的是一片区域。

fragment程序根据插值结果计算最后显示在屏幕上的像素值

vbo/ vertex buffer object

顶点缓冲对象

VBO其实没有用到GPU运算,也就是说他不用写着色语言,直接用opengl函数就可以调用,主要目的是用于加快渲染的速。
我们都知道,受到总线带宽的限制,把顶点数据从CPU传到GPU,是比较花费时间的,特别当我们有上百万个顶点要频繁地传送到GPU的时候。

为了解决这个瓶颈问题,于是便有了VBO,VBO的应用就是在显卡中分配一个显存空间,然后一次性把所有的顶点数据发送到这块显存中保存起来,这样,当我们要刷新3D场景的时候,我们就不需要每次都把上百万个顶点从CPU传送到GPU了,只要直接从VBO对像中读取就行了。数据从CPU到GPU大概只有8G的带宽,而由VBO直接读取,速度是50G以上,几十倍的差别。

fbo/fragment buffer object

FBO与VBO虽然只有一字之差,就它们的意义却大有不同。FBO的主要作用就是改变当前帧缓存的输出路径,除了自身之外,它并不分配内存。默认情况下,显卡的图像数据是输出到帧缓存和深度缓存中去的,帧缓存的数据会直接显示到显示器上。但是用了FBO之后,我们可在改变这一默认的输出方向,把原来要输送到帧缓存或深度缓存的数据输送到一个纹理对像中去,而这个纹理则可以用于后面的运算。

要注意,这里的纹理对像是标准的纹理,要求程序员为其分配显存空间,而FBO只是一个桥梁,起到连接的作用。

pbo/pixel buffer object

PBO设计的目的就是快速地向显卡传输数据,或者从显卡读取数据,我们可以使用它更加高效的读取屏幕数据。

单个PBO读取屏幕数据效率大概和 glReadPixels() 差不多,双PBO交换读取效率会很高。原因是使用PBO时,屏幕上的数据不是读取到内存,而是从显卡读到PBO中,或者如果内部机制是读取到内存中,但这也是由DMA 控制器来完成的,而不是cpu指令来做的,再加上两个PBO交换使用,所以读取效率很高。

还可以使用PBO 高效读取内存数据(比如纹理)到显存中。在没有FBO之前,就是用来它做离屏渲染的。

油画算法/画家算法

所谓画家算法就是像画家画画一样的流程。

painter

先画山,再画草地(草地挡住了一部分山),再画树(树挡住了一部分草地)。

然而有些场景并没有那么简单。作为“画家”的GPU虽然可以一层一层往画布上进行输出,但是无法在某一层渲染完成之后,再回过头来擦除/改变其中的某个部分——因为在这一层之前的若干层layer像素数据,已经在渲染中被永久覆盖了。这就意味着,对于每一层layer,要么能找到一种通过单次遍历就能完成渲染的算法,要么就不得不另开一块内存,借助这个临时中转区域来完成一些更复杂的、多次的修改/剪裁操作。

离屏渲染(offscreen render)

当image buffer需要进行一些额外处理(如圆角、毛玻璃或其他滤镜)并且进行额外处理后无法直接将数据传递至frame buffer进行显示,需要将处理后的数据暂存至offscreen buffer中,再由offscreen buffer传递至frame buffer,最终显示在屏幕上,这个过程就称为离屏渲染。

offscreen buffer同为内存中的一块连续区域。在对图片进行额外处理时用于存放中间合成数据的区域。

render

因此,不一定执行圆角操作(额外处理)就一定会触发离屏渲染,还需要image buffer暂存至offscreen buffer这一过程。

综上,离屏渲染触发条件有两个:

  • 图片(图层)需要额外处理
  • 数据需要暂存至offscreen buffer

如果图片进行额外处理时导致image buffer暂存至offscreen buffer,那么就会触发离屏渲染。可以理解为,图像额外处理过程较复杂,渲染流水线无法找到单次遍历就能完成渲染的算法,需要暂存中间数据至offscreen buffer,待所有操作处理完成后再传递至frame buffer。

即触发数据需要暂存至offscreen buffer的条件是:渲染流水线无法找到单次遍历就能完成渲染的算法,需要开辟新的内存区域(offscreen buffer)保存中间值。

offscreen

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!