OpenGL ES下glsl使用注意事项



  1.  如果glsl里面是vec3类型的变量,那么c++代码必须使用glUniform3fv()传值,使用其它的,例如glUniform4fv,就会出错。
  2. 浮点类型的变量直接和整型的进行算数操作在win32上没有问题,但是在移动平台必须进行强制类型转换后才能使用,否则编译失败。同理,如果一个常量是整形的,例如1,那么直接跟一个浮点型的变量进行算数操作时,Eclipse会报错“ERROR: compile error: 2:27: S0001: Type mismatch in arithmetic operation between 'int' and 'float'”。需要将“1”改成“1.0”。
  3.  Uniform类型的变量不能初始化,否则在win32下不会编译出错,但是在手机上会编译失败。
  4. 千万要留心浮点数精度。glsl里有三种内置精度类型:precision lowp、mediump和highp。2.0下,不论是浮点数还是整数,lowp、mediump、highp分别用8、10、16位实现,而在3.0中分别用8、16、32位来实现。OpenGL ES 2.0下面,FS里支持highp关键字,但是并不要求硬件一定支持,如果硬件不支持,实际运行中会用mediump代替。例如华为Honor的Che2-TL00(Mali-450 MP, glVendor: ARM, glVersion: OpenGL ES 2.0)。谨慎使用精度,既能保证达到想要的效果,性能又高。但是有些效果要求高精度浮点值,例如有的效果希望使用循环纹理,要求传入FS的坐标值很大,只支持低精度的硬件就会出现瑕疵了。变通的方法就是将计算移到VS里。举个例子,之前做过一个效果,面积达到整个屏幕。在红米2下测试帧率降低不多,但是在iPhone 4S和iPhone 5S上发现掉帧非常厉害,掉了10-20帧。由于算法需要较高精度的值,所以必须将其移到VS里计算,计算结果经过光栅化插值后直接给FS使用。当然,这么做有个前提,就是产生的结果是低频的。
  5.  VS里不能修改attribute类型的值,否则Eclipse会报“ERROR: compile error: 2:27: S0027: Cannot modify an attribute variable”。要先将值赋值给一个临时变量,直接对临时变量进行操作。
  6.  FS里不能修改varying类型的变量,否则Eclipse会报“ERROR: compile error: 2:58: S0027: Cannot modify a varying variable inside a fragment shader”。要先将值赋值给一个临时变量,直接对临时变量进行操作。
  7.  同一个编译错误,Xcode和Eclipse的输出信息在表述上略有不同,但核心意思是一样的。

猜你喜欢

转载自blog.csdn.net/CrazyEngine/article/details/79047047