OpenGL ES Shader相关API 总结【4】—— GLSL 语法小结【持续更新】
基本类型:
1.数值类型
2.布尔类型
注意:不能自动转型;矢量也不能自动补齐
变量:
1.a-z, A-Z, 0-9, _
2.首字母不能为数字
3.不能用关键字和保留字作变量名
4.不能以gl_,_webgl_开头
复杂变量
结构体
和C类似
数组
1.只支持一维数组
2.长度必须大于0的整型常量表达式
3.不可用const修饰
注:ES 2.0有以下限制:
4.Vertex Shader中的Sampler和Fragment Shader中的uniform数组只能被常整数表达式索引。(常整数表达式:常整数或常整数的运算)
采样器
1.通过采样器访问纹理
2.sampler2D
3.只能是uniform变量
4.纹理单元编号(至少支持8个)
流程控制
1.if / else if / else
注:ES 2.0有以下限制:
①条件只能是bool类型;
②条件最好是uniform类型。
2.for(和C类似)
注:ES 2.0有以下限制:
①循环条件中的loop_index必须是和常量表达式比较;
②循环条件中的loop_index只能和常量表达式进行增减;
③循环主体中的loop_index相当于常量,不能被修改;
④不支持while和do-while循环。
内置函数
三角函数
指数函数
通用函数
几何函数
矩阵函数
矢量函数
纹理查询函数
限定字
存储限定字:
精度限定字:
precision lowp float
为变量指定合适的精度能够显著提高shader的性能
精度限定字表:
精度 | 浮点型范围 | 整型范围 |
highp | -2^62~2^62 | -2^16~2^16 |
medump | -2^14~2^14 | -2^10~2^10 |
lowp | -2.0~2.0 | -2^8~2^8 |
在顶点着色器中,如果没有指定默认精度,则int和float的默认精度都是highp。对于片元着色器,float类型的默认精度没有默认值,必须显示的声明。并且在fs中,不一定支持highp,可查询得知是否支持(GL_FRAGMENT_PRECISION_HIGH定义,或者查询OES_fragment_precision_high扩展)。
不变量限定字:
Invariance:
invariant关键字可以作用于vs输出的任意varying变量上。
shader在编译时,编译器可能进行优化,导致指令被重排。这意味着两个shader间相同的计算,不一定产生精确相等的结果。这对于multipass渲染来说是个问题,一个物体被渲染多次,如果计算出来的位置有差别,就会有瑕疵。比如产生z-fighting。
使用invariant可以在写shader时指定如果使用了相同的计算,输出的结果必须精确一致。
1.invariant关键字可以使用在varying声明上或者已经声明的varying上。
-
invariant gl_Position; //内置的已经声明的varying,使用invariant
-
invariant varying texCoord; //声明时使用invariant
#pragmaSTDGL invariant(all)
文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。
原文链接:panda1234lee.blog.csdn.net/article/details/51374445
- 点赞
- 收藏
- 关注作者
评论(0)