webGL:|webGL: vertexAttribPointer 函数理解
MDN官方定义
告诉显卡从当前绑定的缓冲区(bindBuffer()指定的缓冲区)中读取顶点数据。
语法
void gl.vertexAttribPointer(index, size, type, normalized, stride, offset);参数
- index
指定要修改的顶点属性的索引 - size
指定每个顶点属性的组成数量,必须是1,2,3或4。 - type
指定数组中每个元素的数据类型 - normalized
当转换为浮点数时是否应该将整数数值归一化到特定的范围 - stride
一个GLsizei,以字节为单位指定连续顶点属性开始之间的偏移量(即数组中一行长度)。不能大于255。如果stride为0,则假定该属性是紧密打包的,即不交错属性,每个属性在一个单独的块中,下一个顶点的属性紧跟当前顶点之后。 - offset
GLintptr (en-US)指定顶点属性数组中第一部分的字节偏移量。必须是类型的字节长度的倍数
参数理解
- index
通过gl.getAttribLocation(gl.program, "a_Position")
方法可以返回a_Position
属性的索引,这就是index
需要的数据 - size
你需要取几个数据。
例如:
const verties = new Float32Array([ 0.0, 0.5, -0.4, 0.19607843137254902, 0.8431372549019608, 0.8745098039215686, -0.5, -0.5, -0.4, 0.4, 1.0, 0.4, 0.5, -0.5, -0.4, 1.0, 0.4, 0.4, 0.5, 0.4, -0.2, 1.0, 0.4, 0.4, -0.5, 0.4, -0.2, 1.0, 1.0, 0.4, 0.0, -0.6, -0.2, 1.0, 1.0, 0.4, 0.0, 0.5, 0.0, 0.4, 0.4, 1.0, -0.5, -0.5, 0.0, 0.4, 0.4, 1.0, 0.5, -0.5, 0.0, 1.0, 0.4, 0.4, ]);
如果参数设置为3, 那就是说需要3个数据。
- type
指定数据类型,gl.FLOAT
,gl.BYTE
等等数据类型,一般为gl.FLOAT
- normalized
对于参数gl.FLOAT
无效 - stride
设置偏移量, 首先拿到const FSIZE = verties.BYTES_PER_ELEMENT
, 也就是数组的字节长度,偏移量必须是字节长的的倍数。
1*FSIZE
,则取的数据为:`0.0, 0.5, -0.4`,
`0.5, -0.4, 0.19607843137254902`,
`-0.4, 0.19607843137254902, 0.8431372549019608,`
如果设置为
3*FSIZE
, 则取的数据为:0.0, 0.5, -0.4
, 0.19607843137254902, 0.8431372549019608, 0.8745098039215686
,-0.5, -0.5, -0.4
- offset
需要配合上一个参数理解,
例如:gl.vertexAttribPointer(a_Position, 3, gl.FLOAT, false, FSIZE * 6, 3*FSIZE);
首先一次拿去6个数据,其中需要的是偏移3个单位的数据,再加上size
等于3,所以可以确认所拿的数据是后3个,
比如第一次拿6个单位数据:
0.0, 0.5, -0.4, 0.19607843137254902, 0.8431372549019608, 0.8745098039215686
【webGL:|webGL: vertexAttribPointer 函数理解】这次正真拿到的则是0.19607843137254902, 0.8431372549019608, 0.8745098039215686
推荐阅读
- Python学习之函数的定义与使用详解
- 关于拷贝构造函数和赋值运算符
- 0|Mozilla Firefox, Apple Safari,Chrome等主流浏览器均开始WebGL支持
- C语言|strlen()函数--使用及模拟实现
- C语言|字符函数、字符串函数、内存函数
- 【源码】vuex@3.6.3
- 节省|节省 58% IT 成本,调用函数计算超过 30 亿次,石墨文档的 Serverless 实践
- 可不要忽视了TypeScript中函数和类的重要性
- C++|PAT乙级-1037
- 四、回调函数