uniform
uniform是GLSL中变量类型的限定符,使用uniform限定的变量是只读值,在Shader中无法更改,只能通过应用程序传递给uniform。
uniform变量为全局共享变量,可以在所有的Shader中可以获取,uniform定义如下:
uniform 变量通常是存储在GPU的”常量区”,这一区域的内存是有限的,因此uniform有个数限制,但比attribute要多很多,OpenGL 标准化组织规定OpenGL ES 2.0规定至少支持128个顶点uniform和16个片段(Fragment)uniform。
获取支持的顶点uniform最大个数代码如下:
获取支持的片段uniform最大个数代码如下:
设置uniform变量值
获取uniform 属性的句柄代码如下:
programHandle代表program句柄,uniformName就是uniform属性的名称。
设置uniform值的方法在Android中比较多,代码如下:
设置float类型的数据,location表示uniform属性的句柄,后面x,y,z,w是值,参数中(x)/(x,y)/(x,y,z)/(x,y,z,w)分别对应vec2/vec3/vec4类型的uniform。
设置vec类型的变量也可以使用如下方法:
设置int类型数据使用如下方法:
设置mat类型使用如下方法:
varying
varying是GLSL中限定符,varying限定的变量只能在shader之间传递,是Vertex Shader(顶点着色器)的输出,Fragment Shader(片段着色器)的输入,Shader中的声明和类型要保持一致。
varying定义格式如下:
在Vertex Shader中定义varying变量并设置为vec4(1,0,0,1),代码如下:
在Fragment Shader中获取color值并使用,代码如下:
与attribute和uniform一样,varying也有数量限制,OpenGL ES 2.0至少支持8个,获取varying的最大个数,代码如下:
varying不仅有个数的限制,还有大小的限制,varying变量最多可以传递32个float数据,或者8个vec4,或者2个mat4矩阵。
更多相关阅读:
本文分享自微信公众号 - 老孟Flutter(lao_meng_qd)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。