理解缓冲:
- glGenBuffers生成指定个数缓冲区对象的名称(唯一id),并不具备任何意义
- glBindBuffer缓冲对象的名称绑定到缓冲目标(opengl有很多目标点类型),就像在指定的缓冲类型中启用了这个id的开关(设置为激活对象),作为缓冲类型其中的某一个对象,之后的任何调用都会用来配置当前绑定的id
- glBufferData为当前绑定的id分配 内存 + 数据
其他操作缓冲函数:
- 1·glBufferData()会分配一块内存,并将数据添加到这块内存中。它的
data
参数设置为NULL
,那么这个函数将只会分配内存,但不进行填充
如何一点一点填充:
- 首先使用glBufferData()分配内存不填充,glBufferSubData()填充缓冲的特定区域,需要偏移量,指定从何处开始填充这个缓冲。
- 范围 = offest + sizeof(*data)
数据拷贝到缓冲:
- 2·glMapBuffer()请求当前绑定缓冲内存的指针,memcpy()直接将数据复制到缓冲当中:,glUnmapBuffer()解除映射,指针将会不再可用,
顶点数据布局:
- 与交错布局123123123123不同,我们将采用分批的方式111122223333
- 含义:这样子我们就能直接将属性数组作为一个整体传递给缓冲,仍可以将它们合并为一个大的数组,哪种方法都不会对OpenGL有什么立刻的好处,它只是设置顶点属性的一种更整洁的方式。具体使用的方法将完全取决于你的喜好与程序类型。
- 对于布局,更改的是 步长(Stride) (表示下一个顶点的这个属性,出现在当前起始点位置 + stride后)&& 起始位置的偏移量(Offset)(数据相对于缓冲中)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(sizeof(positions)));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(positions) + sizeof(normals)));
- 理解交错布局:最开始的起始位置Offset,每个属性的每次的起始点偏移stride,每个属性的字节大小
- 理解分批布局:它的起始位置偏移应该是整个属性数组,每次起始点偏移,非原来的一个顶点大小,变为了当前的顶点字节,其他不变
共享缓冲数据(读写):
- glCopyBufferSubData能够让我们相对容易地从一个缓冲中复制数据到另一个缓冲中。
- 参数:复制源缓冲目标(读),复制目标的缓冲目标(写),源偏移量,目标偏移量,大小
- 如果想读写同一个缓冲目标,glCopyBufferSubData的前两个参数不能为同一个
- OpenGL提供给我们另外两个缓冲目标GL_COPY_READ_BUFFER,GL_COPY_WRITE_BUFFER缓冲目标
- 注意:在调用glCopyBufferSubData之前,需要glBindBuffer,激活缓冲目标中的缓冲id