OpenGL ES
什么是 OpenGL ES?
OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。
OpenGL 基本概念
因为 OpenGL ES 是 OpenGL 的一个子集,所以下面就主要介绍一些有关 OpenGL 的一些基本概念。
OpenGL 的结构可以从逻辑上划分为下面 3 个部分:
- 图元(Primitives)
- 缓冲区(Buffers)
- 光栅化(Rasterize)
图元(Primitives)
在 OpenGL 的世界里,我们只能画点、线、三角形这三种基本图形,而其它复杂的图形都可以通过三角形来组成。所以这里的图元指的就是这三种基础图形:
- 点:点存在于三维空间,坐标用(x,y,z)表示。
- 线:由两个三维空间中的点组成。
- 三角形:由三个三维空间的点组成。
缓冲区(Buffers)
OpenGL 中主要有 3 种 Buffer:
帧缓冲区(Frame Buffers) 帧缓冲区:这个是存储
OpenGL 最终渲染输出结果的地方
,它是一个包含多个图像的集合,例如颜色图像、深度图像、模板图像等。渲染缓冲区(Render Buffers) 渲染缓冲区:渲染缓冲区就是一个图像,它是 Frame Buffer 的一个子集。
缓冲区对象(Buffer Objects) 缓冲区对象就是程序员输入到 OpenGL 的数据,分为结构类和索引类的。前者被称为“
数组缓冲区对象
”或“顶点缓冲区对象
”(“Array Buffer Object”或“Vertex Buff er Object”),即用来描述模型的数组,如顶点数组、纹理数组等; 后者被称为“索引缓冲区对象
”(“Index Buffer Object”),是对上述数组的索引。
光栅化(Rasterize)
在介绍光栅化之前,首先来补充 OpenGL 中的两个非常重要的概念:
-
顶点(Vertex) 就是
图形中顶点
,一系列的顶点就围成了一个图形。 -
片元(Fragment) 是三维空间的点、线、三角形这些基本图元映射到二维平面上的
映射区域
,通常一个 Fragment 对应于屏幕上的一个像素,但高分辨率的屏幕可能会用多个像素点映射到一个 Fragment,以减少 GPU 的工作。
而光栅化是把点、线、三角形映射到屏幕上的像素点的过程。
着色器程序(Shader)
Shader 用来描述如何绘制(渲染),GLSL 是 OpenGL 的编程语言,全称 OpenGL Shader Language,它的语法类似于 C 语言。OpenGL 渲染需要两种 Shader:Vertex Shader
和 Fragment Shader
。
-
顶点着色器(Vertex Shader) 对于3D模型网格的每个顶点执行一次,主要是确定该
顶点的最终位置
。 -
片元着色器(Fragment Shader) 对光栅化之后2D图像中的每个像素处理一次。3D物体的表面
最终显示成什么样
将由它决定,例如为模型的可见表面添加纹理,处理光照、阴影的影响等等。
OpenGL 流水线
OpenGL 中有两种流水线,一种是固定流水线
,另外一种则是可编程流水线。
其中,OpenGL 1.0 版本支持固定流水线。
从OpenGL 2.0版本开始,OpenGL支持可编程的流水线
。也就是说,程序员可以通过Shader(一种程序)来控制GPU渲染的过程。