Chapter 5:OpenGL ES Shading Language
Variables and Variable Types
标量,向量,矩阵
Variable Constructors
类型转换,与c类似变量赋值,注意:矩阵是以列优先的方式存储的
向量:
1. {x,y,z,w} or {r,g,b,a} or {s,t,r,q}
2. OpenGL ES2.0中,下标不允许是变量,因为动态下标对硬件来说是一个艰验证的操作。
Constants
与c类似Structures
与c类似Arrays
1. 不允许用变量作为索引下标
2. 没有初始化语法支持
3. 数组不能声明为const
Operators
向量与向量相乘,向量与标量相乘,矩阵与标量相乘Functions
不可递归。与c类似,除了以下形参声明的关键字
1. in : 以值传递,函数内不可改变【默认】
2. inout :以引用传递,函数内可改变
3. out :变量的值不传递到函数内,但函数返回时会被赋值
Built-In Functions
如dot, pow等Control Flow Statements
与c类似,除了以下限制:
1. 只能一个循环,即不能嵌套
2. 一个循环条件只能用简单的加减来改变
3. 循环结束判断条件只能是循环次数与常量的比较
Uniforms
对于硬件来说,Uniform变量存放在“cosntant store”,该区域是有限的,因此限制了可存放的Uniform变量的个数。
OpenGL ES2.0要求至少提供128个vertex向量uniform和16个fragment向量uniform。
Attributes
attribute仅用在vertex shader中,被用来描述vertex shader的顶点输入。attribute存储位置,纹理坐标,颜色及normals信息。
同uniforms,存放attribute的数量也被硬件受限。OpenGL ES2.0规定,最少要支持8个attribute变量的存放。Varyings
作为vertex shader的输出、fragment shader的输入,因此他们必须必须同时在vertex shader和fragment shader中声明,并且声明要一样。
因硬件的限制,最大的varyings的数量可通过内置变量gl_MaxVaryingVectors获取,最小的数量为8。
Preprocessor and Directives
#error
#pragma
#version
#extension
Uniform and Varying Packing
打包,以充分利用GPU单元的内存。
打包动作,对应用开发者来说是透明的。
Precision Qualifiers
精度修饰符可以用来提示编译器用何种精度进行运算。低精度可以节省电量,但如果精度没用对的话会带来artifacts问题。
精度修饰符可以用来描述浮点型及基于整形的变量。对应关键字为:lowp, mediump, highp
可以在vertex shader或(和)fragment shader代码开头显式标明float和int精度修饰符。
如果没有在vertex shader开头标明精度修饰符,则默认是highp
如果没有在fragment shader开头标明精度修饰符,那么对于float类型来说没有默认精度之说,因此shader中的float类型都要显式标明精度,或者每个float变量都要标明精度修饰符。
OpenGL ES2.0并未要求一定要实现高精度的float。可通过宏GL_FRAGMENT_PRECISION_HIGH定义与否来判断是否支持highp float.
Invariance
因为编译器优化及指令重排序,同样的输入、同样的代码可能会产生不同的输出,特别在multipass shader effects中。
而invariance关键字则保证同样的输入、同样的代码产生同样的输出。这可以用于声明,也可以用于已声明过的变量中。
但invariance会限制优化,因此万不得已尽量少用。