OpenGLES3.0笔记 (二) —— OpenGLES3.0的新功能

OpenGLES3.0在2.0基础上添加了更丰富的最新图形学技术实现,例如:阴影贴图,体渲染(将三维场景数据直接生成二维纹理技术,体纹理就是3D texture),GPU粒子动画,几何形状实例化,纹理压缩和Gamma校正等新技术。

1.纹理处理上的改进:

  • sRGB的gamma校正纹理和帧缓存区:
    允许应用程序执行伽马矫正渲染,存储时可以是gamma校验的纹理(在纹理缓冲区中),读取到着色器时候需要反gamma校正到线性空间,在线性空间进行光照等计算(线性空间计算图像质量更好),输出到帧换缓存区是转换为sRGB伽马校正空间。
  • 2D纹理数组,保存一组2D纹理的纹理目标。OES2.0只有单个纹理,用2D纹理数组做帧动画更加方便,不用修改纹理坐标。
  • 3D纹理,医学成像中直接执行三维数据文件进行体渲染。
  • 深度纹理和阴影比较,深度纹理是从光源位置作为观察点,将深度值写入深度纹理值在[0,1]内,对现有物体的纹理使用纹理堆栈自动计算纹理贴图的(s,t,r,q)坐标,r值缩放到[0,1]内。再从正常视角渲染场景,当场景中物体的纹理r值小于深度纹理中的值时候渲染,大于深度纹理值时候写入0黑色。OES2.0也有深度纹理,3.0增加了阴影比较,可以对2个深度纹理进行线性插值,完成双线性过滤。
  • 无缝立方图,ES3.0中,立方图可以进行采样如过滤来使用相邻面的数据并删除接缝处的尾像。
  • 浮点纹理,拓展了支持的纹理格式,16浮点可以过滤,支持32浮点但是不能过滤。
  • ETC2/EAC纹理压缩,ES3.0中强制支持。格式为:RGB888,RGB8888,以及单通道双通道的int unsign int数据。可以更好的利用纹理缓存,减少GPU内存占用。
  • 整数纹理或其它纹理格式处理能力,对未规范化的整数(8,16,32)纹理,进行直接渲染或读取的能力。
  • 非2次方纹理支持,比如来自视频或camera的不以2的幂次尺寸捕捉/记录的纹理。OES2.0要求是2次方的纹理存储。
  • 纹理细节级别LOD功能,可以手动设置应用的mipmap级别,和设置mipmap范围。
  • 纹理调配,引入新的纹理对象状态,允许独立控制每个纹理通道(RGBA)在着色器中的映射。
  • 不可变纹理,加载纹理数据之前手动指定纹理的格式和大小,这样纹理的格式不可变,OGLES预先执行所有的一致性检查,在绘制物体时候设置跳过一致性检查,可以提高性能。
  • 最小尺寸增大,OES3.0最小纹理尺寸支持为2048。

2. 着色器改进:

  • 二进制shader文件支持,编译后不用再编译,编译链接后不用再编译链接。运行时不需要链接。
  • 强制的在线编译器,OES2.0不一定有shader编译器,3.0要求存在。
  • 非方矩阵支持,比如执行仿射变换是,可以用4x3矩阵代替最后一行为(0,0,0,1)的4x4矩阵,从而减少执行变换所需的指令。
  • 全整数支持,之前是浮点数。有各种内建函数实现从整数到浮点数转换。
  • 质心采样,可以用质心采样声明顶点着色器的输出变量,避免多重采样产生伪命像。
  • 光栅化时平面平滑插值支持,2.0在光栅化时候都是默认线性插值。
  • 统一变量块,统一变量值可以组合为统一变量块,可以高效加载和在多个着色器程序间共享。
  • 布局限定符,在顶点输入,着色器输出多目标渲染,统一变量块内都可以使用,显式绑定着色器源代码中的位置,而不需要调用API.
  • 实例ID和顶点ID,顶点索引可以在顶点着色器中访问,如果使用实例渲染,还可以访问实例ID.
  • 片段深度,片段着色器可以显示控制深度值,而不依赖深度插值。
  • 更多的内建函数。
  • 宽松的指令数量限制,可以支持变量为基础的循环和分支,并支持数组索引。

3. 几何形状和图元装配

  • 变换反馈,可以在缓冲区对象中获取顶点着色器输出,对顶点动画和物理学模拟很有作用。
  • 布尔遮挡查询,避免渲染不必要的区域。
  • 实例渲染,有效的渲染包含类似几何形状但是属性(变换矩阵,颜色和大小)不同的对象,这一功能在渲染大量类似对象时候很有用,例如人群。
  • 图元重启,可以在已有图元中使用特殊索引值表示新图元的开始,避免2.0中插入索引,引入退化的三角形条带。
  • 新顶点格式。包括10-10-10-2有符号和无符号规范化顶点属性;8位、16位和32位整数属性;以及16位半浮点。

4. 缓冲区对象

缓冲区对象主要有:
GL_ARRAY_BUFFER
GL_ELEMENT_ARRAY_BUFFER
GL_COPY_READ_BUFFER
GL_COPY_WRITE_BUFFER
GL_PIXEL_PACK_BUFFER
GL_PIXEL_UNPACK_BUFFER
GL_TRANSFORM_FEEDBACK_BUFFER
GL_UNIFORM_BUFFER

新特性:

  • 统一变量缓冲区对象,可以存储绑定大的统一变量块,统一变量缓冲区对象可以用于减少统一变量值绑定到着色器的性能代价,避免2.0中的性能开销。
  • 顶点数组对象VAO,应用程序可以一次API调用避免多次调用设置VBO的开销。
  • 采样器对象,将采样器状态(纹理循环模式和过滤)与纹理对象分离,这为在纹理中共享采样器状态提供了更搞笑的方法。
  • 同步对象,查询等待GPU上完成执行的机制,应用程序可以控制OES命令在同步对象返回后再提交操作进入操作队列。
  • 像素缓存区对象异步操作,CPU可以异步操作像素和纹理传输,在传输期间CPU可以执行其他的任务。
  • 缓冲区子区域映射,传统是整个缓冲区映射,现在可以对一个指定区域进行映射,供CPU访问。
  • 缓冲区对象间拷贝,不需要CPU等待。

5. 帧缓冲区

  • 多重渲染目标(MRT)
    片段着色器可以输出多个颜色,每个颜色关联到一个颜色缓冲区,MRT用于许多高级的算法,例如延迟着色。
  • 引入多重采样渲染缓冲区
    使应用程序渲染到具备多重采样抗锯齿功能的屏幕外帧缓冲区,该区不能绑定到纹理,但是可以解析为单采样纹理移动到新的帧缓冲区。
  • 帧缓冲区失效机制,避免峰值时候还进行帧缓冲区内容恢复,DX中的后台颜色缓冲区discard机制。
  • 新的混合方程式,允许帧缓冲区用max/min函数作为混合方程式。

你可能感兴趣的:(OpenGLES3.0笔记 (二) —— OpenGLES3.0的新功能)