整合:OpenGLES 渲染管线系列(1)

项目用到OpenGLES渲染视频,把部分图像处理工作交予GPU从而分担CPU压力。项目后总结,学习并研究OpenGLES的渲染原理,查阅了一些资料,加上自己理解,精简整合并输出此文档。原出处如下:

链接:www.songho.ca/opengl;www.zhihu.com/question/29163054/answer/296309838;

渲染管线(Rendering Pipeline)

        在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。图形渲染管线是一系列按序处理操作,可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素,最终会写入frameBuffer进行显示。

注:2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制;Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程

                          整合:OpenGLES 渲染管线系列(1)_第1张图片

  1. Display List;是一组用于将来执行而提供的已编译好的OpenGL命令集,所有的数据、顶点和像素都可以存储在一个display list中,它可以缓冲这些数据为OpenGL命令集的执行提高效率。
  2. Vertex Operation;一组3D坐标集合(Vertex Data),通过ModelView矩阵操作,由object坐标系向eye坐标系变换。
  3. Primitive Assembly;按照图元的规则(点、线、三角形),将Vertex Data装配并构造成图元。其中,图元还会经过投影、裁剪、透视除法等变化,才能从3D场景映射成屏幕场景。
  4. Pixel Transfer Operation;将客户应用端读入的Pixel Data,进行scaling、bias、mapping和clamping等操作。Pixel Data既可以储存在texture memory中,也可以直接送往Rasterization光栅化。
  5. Texture Memory;纹理图像被加载到Texture Memory中,用于图元的贴图。
  6. Raterization;将图元和纹理分解成一个个fragment,将图元的点线面转换成由一个个栅格构成的像素。
  7. Fragment Operation;为每一个fragment确定颜值,其对应着framebuffer中的一个像素,然后通过blending、dithering、logical与masking等操作,最终会将图元和纹理贴图映射成屏幕framebuffer上相应的像素。

以下是3D空间中的一个三角形被渲染到屏幕上的例子:

                 整合:OpenGLES 渲染管线系列(1)_第2张图片

总结:上图分为两条路径,分别为几何路径和图像路径,前者是将3D场景变换成屏幕图元,而后者是为图元确定颜色信息(形象地说就是将图像贴到图元上);我们可以使用glReadPixers()读出屏幕framebuffer图像,而glCopyPixels()不能被应用读出,只能将数据拷贝到另一个framebuffer;使用glRenderMode(GL_FEEDBACK)可以读出已变换的Vertex Data。

 

 

 

你可能感兴趣的:(整合)