一、Opengles特性
1.对Opengl的简化,比如OGL指定网格数据,可以用立即模式,可以显示列表,和顶点数组;但是Opengl es上
只能用顶点数组方式传递几何数据。
2.对Opengl兼容,尽量定义为一个精简的opengl子集,也能够在Opengl中运行。
3.为了降低耗电和提高shader性能,
引入了类型精度限定符。
4.确保实现图像质量的最小功能集,符合openglel图像质量,正确性和稳定性。
OES3.0兼容2.0,但是也有一些少量改变,OES3.0可以在帧缓冲区对象在各个 content之间共享,cube texture总是使用无缝过滤,有符号定点数转换为浮点数也有小修改。单OES3.0/2.0和OES1.0不兼容,因为有了可编程管线就可以放弃固定管线,因为同时兼容可编程和固定管线内存占用会大得多。在一个进程中支持多个Opengl es渲染上下文对象,在一个进程中跨opengl es渲染上下文对象共享对象(例如顶点或纹理缓冲区)。
OES渲染所用的窗口系统是EGL,只有IOS不支持EGL,EGL负责初始化显示器,创建渲染表面(帧缓冲区,颜色,深度,模板缓存区,以及他们的格式),创建OES实例(必须要链接到合适的渲染表面才能创建成功),OES可以和其它图形API或窗口的原生绘图命令之间同步渲染。OES还管理纹理贴图等资源。Apple有自己的实现叫EAGL。
OES程序的头文件和库:
#ifdef __APPLE__
#include <OpenGLES/ES3/gl.h>
#else
#include <GLES3/gl3.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#endif
基本状态管理,可以用glEnable(GLenum cap)开启; glDisable(GLenum cap)关闭;除了GL_DITHER抖动是默认开启的,其它都是默认关闭的,可以用glIsEnabled(GLenum cap)来查询。错误可以用GLenum glGetError()来查询。
二、OpenglES3.0新特性
OES1.0版本是基于固定管线的,OES2.0全面引入了顶点着色器和像素着色器渲染模式,OES3.0在2.0基础上添加了更丰富的最新图形学技术实现,例如:
阴影贴图,体渲染(将三维场景数据直接生成二维纹理技术,体纹理就是3D texture),GPU粒子动画,几何形状实例化,纹理压缩和Gamma校正等新技术。
1.纹理处理上的改进:
1).sRGB的gamma校正纹理和帧缓存区:
存储时可以时gamma校验的纹理(在纹理缓冲区中),读取到着色器时候需要反gamma校正到线性空间,在线性空间进行光照等计算(线性空间计算图像质量更好),输出到帧换缓存区是转换为sRGB伽马校正空间。
2).2D纹理数组,OES2.0只有单个纹理,用2D纹理数组做帧动画更加方便,不用修改纹理坐标。
3).3D纹理,医学成像中直接执行三维数据文件进行体渲染。
4).深度纹理和阴影比较,深度纹理是从光源位置作为观察点,将深度值写入深度纹理值在[0,1]内,对现有物体的纹理使用
纹理堆栈自动计算纹理贴图的(s,t,r,q)坐标,r值缩放到[0,1]内。再从正常视角渲染场景,当场景中物体的纹理r值小于深度纹理中的值时候渲染,大于深度纹理值时候写入0黑色。OES2.0也有深度纹理,3.0增加了阴影比较,可以对2个深度纹理进行线性插值,完成双线性过滤。
5).无缝cube texture,面之间无缝.
6).浮点纹理,拓展了支持的纹理格式,16浮点可以过滤,支持32浮点但是不能过滤。
7).ETC2/EAC纹理压缩,格式为:RGB888,RGB8888,以及单通道双通道的int unsign int数据。可以更好的利用纹理缓存,减少GPU内存占用。
8).整数纹理或其它纹理格式处理能力,对未规范化的整数(8,16,32)纹理,进行直接渲染或读取的能力。
9).非2次方纹理支持,OES2.0要求是2次方的纹理存储。
10).纹理LOD功能,可以手动设置应用的mipmap级别,和设置mipmap范围。
11).纹理调配,引入新的纹理对象状态,允许独立控制每个纹理通道(RGBA)在着色器中的映射。
12).不可变纹理,加载纹理数据之前手动指定纹理的格式和大小,这样纹理的格式不可变,OGLES预先执行所有的一致性检查,在绘制物体时候设置跳过一致性检查,可以提高性能。
13).最小尺寸增大,OES3.0最大纹理支持为2048.
2.着色器改进:
新特性:
1).二进制shader文件支持,编译后不用再编译,编译链接后不用再编译链接。
2).OES2.0不一定有shader编译器,3.0要求存在。
3).非方矩阵支持。
4).全整数支持,之前是浮点数。
5).质心采样,可以用质心采样声明顶点着色器的输出变量,避免多重采样产生伪命像。
6).光栅化时平面平滑插值支持,2.0在光栅化时候都是 默认线性插值。
7).统一变量块,可以高效