attribute是GLSL中特殊的变量类型,用于从“外部”到顶点着色器的通信,只能用于Vertex Shader(顶点着色器),不能用于其他Shader中,attribute 通常用来存储位置坐标、法向量、纹理坐标和颜色等,定义如下:
OpenGL 标准化组织规定OpenGL ES 2.0 至少支持8个attribute,OpenGL ES 3.0至少支持16个attribute,注意这里是至少,也可以多于8个,通过代码获取支持attribute的最大个数,Kotlin代码如下:
下面是一个非常简单的Vertex Shader:
vPosition就是顶点数据,这个数据需要应用程序从外部传入,下面介绍如何将应用程序的顶点数据传递给我vPosition。
在Android中获取句柄Kotlin代码如下:
programHandle是program的句柄,attrName是attribute的名称。
在Android中通常情况下顶点数据的类型是FloatBuffer,定义了3个顶点的Kotlin代码如下:
设置顶点数据,即将顶点数据从CPU传递到GPU,Kotlin代码如下:
这里定义了一个通用的方法,方法说明如下:
GLES20.glEnableVertexAttribArray(location)
激活当前attribute,location就是第一步中获取的vPosition的句柄,
GLES20.glVertexAttribPointer
设置attribute属性如何从buffers中获取数据。官方API地址:https://www.khronos.org/registry/OpenGL-Refpages/es2.0/ ,参数说明如下:
location:attribute属性的句柄,对于本应用程序是指第一步中获取的vPosition的句柄。
pointSize:每一个attribute顶点数据的个数,返回看下第二步中定义顶点数据的数组,每个顶点由3个float组成,代表x,y,z,也可以由2个float代表一个顶点(x,y),对于本应用程序值是3。
type(第三个参数):顶点数据的类型,对于本应用程序是float,值是GLES20.GL_FLOAT。
normalized(第四个参数):是否归一化,将不是float的类型转为float,比如short转float,Android正常情况下不需要归一化,所以设置false。
stride(第五个参数):两个连续顶点之间的偏移量,对于本应用程序来说,顶点之间是连续的,设置为0。
顶点buffer
attribute参数的数据并不是一个内存的索引,而是定义了去哪个内存区域取数据,在GPU中attribute存放在一块固定区域,GPU计算的时候去buffer处取数据,结构如下图:
应用程序将数据传递给GPU后,这些数据保存在GPU的一块内存中,上面定义的顶点数据结构如下图:
顶点数据的结构别不是都这样,数据结构取决于你定义的顶点数据。
如果此文章对您有所帮助,欢迎扫码关注订阅号。
本文分享自微信公众号 - 老孟Flutter(lao_meng_qd)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。