Shader language:
访问vector某个分量,必须用常量,不能用一个表达式。
Matrix 和Vector都是用列来描述。
访问array某个下标,只能用常数。不能再定义的时候初始化,不能定义为常量数组,必须一个个数组元素的初始化。
函数不能迭代。有些GPU没有stack和flow的control,shader函数是inline。
Uniform是从api层传下来的只读的变量。
Uniform存在constant buf中,varying存在interpolators中。需要packing。规则是让产生代码的复杂度保持常量。即不需要进行重排使得编译器产生额外的代码来融合unpack 的data。
Precision qualifier:只有es才有,desktop没有。保持速度和电量。VS默认为high精度,PS必须要指定精度。
Invariance: es引入。因为compiler会优化shader导致指令重排。指令重排的结果就是相同的输入不一定有相同的结果。Case:multipass shader effect.将一个物体使用alpha blending画在他自己的上面。通常叫做Z fighting。Z精度的不同导致结果不一样。比如先一个vs+fs(fs处理光照)再一个相同vs+fs(fs处理环境光和散射光)结果会不同。使用invarient可以保证相同的操作得出相同的结果。
Vertex attributes, arrays and buffer object
设置const attribute只能用float型,因为const attribute用的少,而且内部基本都要转化成为single-presicion float point
在vs里面声明vertex attribute: attribute不会像uniform和varying一样被pack。每个通道都被存储为32bit single precision floating point. 声明为attribut的在vs里面是作为只读的。
PA