OpenGL es 流水线与驱动

来源:互联网 发布:飞思软件 mac 版 编辑:程序博客网 时间:2024/04/30 09:30

一、OpenGL ES Pipeline的概念:

OpenGL es 流水线就是将用户输入的3D数据经过一系列的处理最终生成用户在屏幕上看到的3D图像。这一过程由一系列专业的模块组成,如下图所示。


二、OpenGL es pipeline的功能特点:

3D图形=》3D图像:3D图形是精确描述的矢量数据,而3D图像是在光栅设备上显示的离散的像素数据


模块功能专一:每一个模块只处理单一的数据类型

并行处理能力:因为处理过程中大量的数据都是矢量数据,而矢量数据处理的特点就是并行,因此越来越多的被用在大数据处理领域。

批量处理方式:不是来一个模型就绘制一次,而是有一个缓冲区,叫command buffer,我们不停的往这个缓冲区填写数据填写绘图命令,直到这个缓冲区被填满,填满之后这个缓冲区的数据会被一次性提交给硬件,由硬件去处理,所以说它是一次性的处理多个绘制命令的这么一个过程。这种批量处理的方式有非常高的效率。

三、OpenGL es 的模块结构:

(1)首先3D数据以Vertex Arrays或者Buffer objects的方式进行组织,区别在于vertex arrays是非常简单的指针数据,告诉我们用哪段内存存储了哪些数据,而buffer objects以一种object的形式对vertex arrays的数据进行管理,在我们需要频繁大量地切换显示数据的时候,使用buffer object 会非常方便,只需要切换不同的对象就可以了。

(2)顶点数据被送到vertex shader进行顶点编程,用户在vertex shader当中可以load自己的算法数据,通过编写自己的算法从而达到对vertex处理进行编程的操作。

(3)这一步就是primitive assembly,生成图元。所谓图元就是OpenGL es 绘制的基本对象,它包括点、线、三角形直线。

(4)Rasterization光栅化。作用是生成像素,即前面输入来的数据是一个3D的矢量数据,这一部分要完成从3D矢量数据到屏幕像素的这么一个转换过程.

(5)生成像素后,下面就是对像素进行编程,这一部分操作是由fragment shader来完成的,与vertex shader类似,它也是读入用户自定义的算法,通过用户自定义的算法来对像素数据进行处理,

注:vertex shader和fragment shader当中可能都会涉及纹理的读取,通过读取外部的纹理来进一步丰富物体的表面细节。

(6)在fragment shader处理完成之后,像素数据被输入到per-fragment operations这个处理阶段,这个阶段对像素进行一个逐像素处理的操作,这个操作是固定功能的操作,是不可编程的,在这个操作完成后,像素数据最终被输出到frambuffer中

以上就是OpenGL es处理管线的基本处理流程,如下图所示,



四、相关概念:

(1)vertex,有以下几种数据:coordination,Normal,color...法线normal在光照的时候用的比较多

(2)shader:可编程处理单元,OpenGL es2.0以上版本才有的,包括vertex shader和fragment shader

(3)primitive :OpenGL es里有三种图元:Points,lines,triangles,任何复杂的模型都会被分解成最基本的图元进行渲染

(4)Raseterization:Vector=>Pixels

(5)Fragment:Pixel Data,在OpenGL里面,在像素最终被输出到frame buffer的时候,即最终被输出到屏幕上的时候,我们都会把它叫作fragment,中文叫片断,因为它不仅包括颜色还包括一系列其他的数据,而最终输出到屏幕上的pixel以后我们才把它叫做像素

(6)Texture Mapping纹理贴图:Image=》Triangle

(7)Framebuffer:pixel memory:最终将输出到屏幕上的pixel数据。

五、概念详解:

1.shader

Fixed Function Pipeline(OpenGL es 1.x)功能有限,无法扩展,在这样的管线中,所有模块的功能算法是固定不变的,只能根据数据的参数进行选择或者微调。

Programmable Function Pipeline(OpenGL es 2.0及以上)

功能强大,扩展性强。

可编程模块=》shader

2.顶点数据管理

顶点数据分类:(1)空间坐标:(x, y, z),描述对象在空间当中的位置(2)纹理坐标:(u, v, w),用来在纹理数据当中裁取纹理数据的坐标(3)法线(xyz)表示一个方向,在表示光照的时候用的多,(4)颜色:(rgba)

顶点数据管理形式:1.vertex array,2.element array,3.buffer object

vertex shader:处理vertex数据的shader:决定输出的顶点颜色,位置等

Fragment shader:处理fragment数据的shader:决定最终输出的fragment的颜色。

vertex shader:



(1)[Input]Attribute:Vertex data(coordinate,color,normal,...)只读的,作为输入数据

(2)[input]Uniform:matrix,light

(3)[input]Sampler采样器:主要用于Texture Mapping的操作,贴图的时候需要从纹理数据中读取纹理数据,这个时候就会用到sampler

(4)[output]Varing:Per-fragment,interpolated,to fragment shader对vertex shader来说,它是一个输出变量,它是针对每个fragmengt的,用pipeline的其他模块进行插值,输出到fragment shader当中

(5)[input/output]Builtins:Reserved内建变量,系统保留变量,系统可能用到这些变量进行一些处理

3.光栅化:将图元映射到像素设备,如屏幕或离线Framebuffer。因为图元本身是一个矢量描述的对象,这个过程实际上就是决定在屏幕上我们用哪些像素来显示和表示这个图元对象

4.纹理:将位图映射到模型表面,以增加模型视觉细节的技术

5.





6.Fragment操作,从fragment shader出来以后,fragment数据要经过一系列的测试操作,如果测试通过,它会被送到下一个模块,如果测试失败,将会被丢弃掉




(1)首先fragment数据从fragment shader输出以后,进入测试单元pixel ownership test,因为在现代的运行环境当中,实际上会有多个渲染进程,所以我们要确认我们当前的像素是否属于当前的渲染进程,如果不是不做处理,这个过程对我们来说是透明的,应用程序开发人员是看不见它的

(2)Scissor test,指的是我们在屏幕上设置一个区域,我们渲染的东西就只显示在这个区域当中,在这个区域之外的像素就丢弃掉,不再做任何处理

(3)stencil test,做镜像效果

(4)depth test,在3d程序中,我们只把离我们最近的像素绘制出来,离我们最远的被挡住的部分不被绘制,这样在绘制之前要进行一个测试,查看我们要绘制的像素即fragment与我们已经有的在framebuffer当中的fragment进行深度值比较,如果比较近我们就把它保留下来,如果比较远 说明它被挡住了,就把它丢掉

(5)blending就是半透明的alpha混合,如果我们要绘制的像素是有一个alpha值的,那么我们会根据这个alpha值把它和framebuffer当中很难过已经有的颜色进行一个线性的混合

(6)dithering抖动,可以在低精度的显示设备上模拟高精度的显示,比如用16位颜色模拟32位颜色的显示

7.Framebuffer:指的是存放fragment的内存空间,它的大小一般和屏幕大小和窗口大小是一致的,按照它的存储类型,一般分为如下几种:

(1)color buffer:存储颜色信息,颜色信息就是我们最终在屏幕上看到的效果

(2)depth buffer:存储深度信息,在depth test中会用到,通过它来决定对象之间的远近关系遮挡关系,

(3)stencilbuffer:存储stencil数据

六、OpenGL驱动程序

1、驱动程序的基本概念

通常指的是设备驱动程序,它是一种可以使计算机和硬件进行通讯的特殊程序,相当于硬件的一个软件抽象接口,只有通过这个接口,才能控制硬件设备的工作,如果驱动程序本身没有正确安装的话,那么硬件也无法正常工作。同样的硬件同样的系统不同的驱动,所表现出来的效果也是千差万别的

驱动程序在系统层次中所处的位置:

(1)首先是应用程序,应用程序要使用某个功能的话,它发出请求,发出请求是通过调用API的方式来完成的,即我们所说的应用程序接口,应用程序接口将接收到的数据打包传送给驱动程序,然后由驱动程序对这些数据和命令进一步进行整理,解释成为硬件能理解的数据,驱动硬件去执行。可见,驱动程序扮演着一个中间人的功能,它把应用程序的请求和硬件设备的实际功能连接起来。


2、OpenGL es驱动程序的基本结构




0 0