第一章
简介
- OpenGL ES从OpenGL中删除一切冗余;
- 为降低电源消耗,着色语言引入精度限定符;
1.1
1.1.1 顶点着色器
- 输入包括着色器程序,属性,统一变量,采样器;
- 输出在2.0中称为可变变量(varying),但在3.0中称为输出变量(out);
- 在光栅化阶段,会为每个输出值进行插值,生成的片段值给片元着色器;
- 3.0增加了一个新功能--变换反馈;
1.1.2 图元装配
- 在图元装配阶段,顶点被组合成图元;
- 如果图元没有在视锥体内,则需要裁剪;
- 裁剪后,顶点位置被转换为屏幕坐标;
- 也可以进行淘汰操作,根据图元面向前方或后方抛弃它们;
1.1.3 光栅化
- 光栅化是将图元转化为一组二维片段的过程;
1.1.4 片段着色器
- 片段着色器的输入在图元之间进行线性插值,然后传递给片段着色器;
1.1.5 逐片段操作
- 像素归属测试:测试像素目前是不是归OpenGL ES所有。个人理解是当前显示的窗口是否是对应当前OpenGL ES上的Framebuffer,如果不是,就不必要输出了;
- 裁剪测试:不是在图元装配时做了裁剪吗?
- 模板和深度测试:略;
- 混合:将新生成的片段颜色值和保存在帧缓冲区(xw,yw)位置的颜色值组合起来;
- 抖动??没用过
- Alpha测试??没用过
1.2 OpenGL ES 3.0 新功能
暂时省略...
1.4 EGL
- 渲染上下文存储相关的OpenGL ES状态;
- OpenGL ES API没有提及如何创建渲染上下文,或者渲染上下文如何连接到原生窗口。EGL是Khronos渲染API和原生窗口系统之间的接口;在实现OpenGL ES时,没有提供EGL的硬性需求。个人理解,EGL就是OpenGL ES和窗口系统的桥梁;
第4章 着色器程序
4.1 着色器程序
- glValidateProgram是一个速度很慢的操作,一般用于调试的目的;
4.2 统一变量和属性
- 如果统一变量在顶点着色器和片段着色器均有声明,则声明类型必须相同,且在两个着色器中的值也需相同;
- 在链接阶段,链接程序将为程序中与默认统一变量块相关的活动统一变量指定位置,这些位置是应用程序用于加载统一变量的标识符;
- 用GL_ACTIVE_UNIFORMS参数调用glGetProgramiv,可以获得程序中活动统一变量的数量,如果统一变量被使用,就认为它是“活动”的,换言之,如果你声明了但从未使用,链接程序很可能在优化时去掉,不在活动统一变量列表中返回;
- glGetActiveUniform,可以确定几乎所有统一变量的属性。你可以确定统一变量的名字和类型;
- glUniform调用不以程序对象句柄作为参数,原因是,glUniform总是在与glUseProgram绑定的当前程序上操作;
4.2 统一变量缓冲区对象
- 使用统一变量缓冲区对象,可以在更新大的统一变量块时降低API开销(优化点);
- 用glBufferData,glBufferSubData, glMapBufferRange和glUnmapBuffer等;
- 具体用法看第61页;
4.4 程序二进制码
- 可以避免在线编译的代价(优化点);
第5章 OpenGL ES着色语言
5.2 着色器版本规范
1.#version 300 es ,没有声明版本号被认定为使用1.00版本,它用于OpenGL ES2.0,OpenGL ES3.0增加了许多特性(第68页);
5.4 变量构造器
- OpenGL ES着色语言在类型转换方面有非常严格的规则,变量只能赋值为相同类型的其他变量或者与相同类型的变量进行计算;
- 不允许隐含类型转换的原因,避免着色器作者遇到可能导致难以跟踪的缺陷的意外转换;
5.10 函数
- 函数不能递归;
5.13 统一变量
- 在编译时已知值的变量应该是常量,而不是统一变量,这样可以提高效率;
- 统一变量的命名空间在顶点着色器和片段着色器中都是共享的;
- OpenGL ES3.0 实现必须提供至少256个顶点统一向量和224个片段统一向量;
5.14 顶点和片段着色器输入/输出
- 顶点输入,也叫属性变量;
- 顶点着色器输出/片段着色器输入,在硬件上通常称为插值器;
- OpenGL ES3.0 实现最小属性为16个;
- 两种插值:平滑着色和平面着色(没用过)(79页);
5.18 统一变量和插值器打包
- GPU通常会按照向量位置索引对常量存储进行索引。打包必须使数组跨越行边界,这样索引才能够起作用;
- 打包影响统一变量和顶点着色器输出/片段着色器输入的计数方式,如果你想要编写保证能够在所有OpenGL ES3.0实现上运行的着色器,就不应该使用打包之后超过最小运行存储大小的统一变量或插值器;
5.19 精度限定符
- OpenGL ES规范中没有规定底层硬件中必须支持多种精度;
- 顶点着色器中,如果没有指定默认精度,则默认精度都是highp,片段着色器中的浮点值必须声明float的精度;
5.20 不变性
- 着色器需要编译,编译器可能进行导致指令重新排序的优化,这意味着两个着色器之间的等价计算不能保证产生完全相同的结果;
- invariant关键字可以用于变量声明,或者用于已经声明的变量;
- 因为编译器需要保证不变性,所以可能限制它所做的优化,因此应在必要时使用;
网友评论