OpenGL
OpenGL(全名:Open Graphics Library) 所以一个图形API,由C++编写的图形处理框架,跨平台,严格规定了每个函数的执行,以及它的输出。但实现由OpenGL库的开发者自行决定。所以OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug。
OpenGL ES
OpenGL API 规模庞大而复杂,OpenGL ES是在OpenGL嵌入式设备上面的版本,也就是安卓/iPhone,其他嵌入式等移动设备的编程规范。
图片描述3.0图形管线的各个阶段,阴影部分表示管线的可编程阶段
图形管线
顶点着色器 Vertex shader
相当于告诉opengl图形的顶点,由此得知形状,才能进一步进行填充颜色等等。相当于一个骨架
一般⽤用来处理图形每个顶点变换(旋转/平移/投影等)
顶点着⾊器是OpenGL中⽤于计算顶点属性的程序。顶点着色器是逐顶点运算的程序,也就是说每个顶点数据都会执行一次顶点着⾊器,当然这是并行的,并且顶点着⾊器运算过程中无法访问其他顶点的数据
一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由自身坐标系转换到归⼀化坐标系的运算,就是在这里发生的。
顶点着色器的计算也是由GPU负责
图元装配
图元是三角形、直线或者点精灵等几何对象。图元的每个定点被发送到顶点着色器的不同拷贝。在图元装配期间,这些顶点被组合成图元。
光栅化 Rasterization
绘制对应的图元(点精灵、直线或者三角形)。将图元转化为一组二维片段的过程,然后这些片段由片段着色器处理。这些二维片段代表着可在屏幕绘制的像素。
片段着色器
也称之为片段着色器,像素着色器,对每个像素的显示进行处理,即一张图片,有很多像素点,每个像素点都需要经过片元着色器才能进行显示,所以需要大量计算,故使用GPU进行计算,而CPU擅长判断(基于单片机原理),这就是GPU的优势
⼀般用来处理图形中每个像素点颜色计算和填充
⽚段着色器是OpenGL中用于计算片段(像素)颜⾊的程序。⽚段着色器是逐像素运算的程序,也就是说每个像素都会执行⼀次片段着⾊器,当然也是并⾏的
另外GPU使用的是显存,内存是用于和CPU交互时使用
EGL
OpenGL ES和原生窗口系统之间的接口;在实现OpenGL ES时,没有提供EGL的硬性需求。需要根据方案商提供的文档确定支持的接口。
任何OpenGL ES应用渲染前必须使用EGL执行:
- 查询并初始化设备可用的显示器
- 创建渲染表面
- 创建渲染上下文
EGL语法
方法都以egl前缀开头,EGL数据类型也以Egl前缀开始,对于组成类型名的美俄单词采用首字母大写(EGLint和EGLenum除外)。数据类型如下:
OpenGL ES 命令语法
前缀以gl开始,gl后首字母大写glBindTexture。
数据类型以GL前缀开头
错误处理
GLenum glGetError(void)
状态管理
渲染管线的每个阶段都有一个可以启用或者禁用的状态。初始化OpenGL ES 上下文(EGLContext)时,状态默认值初始化。除了GL_DITHER被设置为GL_TRUE之外,其他功能的初始化值均被设置为GL_FALSE。
void glEnable(GLenum cap) //启用
void glDisable(GlLenum cap) //禁用
GLboolean glisEnabled(GLenum cap)//查询禁用状态