glBufferSubData
glBufferSubData用来更新一个已有缓冲区对象中的一部分数据
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
参数:
target: 可以参考glBufferData中的描述,用来指定需要更新的缓冲区对象的类型
offset: 指定了更新数据相对于缓冲区对象中原始数据开始位置的偏移量,也就是说要从什么地方开始更新原来的数据(以字节为单位)
size:需要更新的数据量的大小
data:一个指向新数据源的指针,将新的数据源拷贝到缓冲区对象中完成更新
描述:
glBufferSubData用来更新缓冲区对象中的数据,可以更新一部分或者整个缓冲区中的数据(取决于offset和size的取值),如果offset是0,而size正好是用来缓冲区存储数据的大小,那么整个数据就会被新的数据所替换。需要注意的是offset和size必须保证在原来缓冲区对象可以表示的范围之内。(加入原来缓冲区对象中存储了1024个字节,那么offset就不能大于1024,因为这样的话就没法更新数据了)
glClearBufferSubData
glCearBufferSubData 用一个固定的值填充缓冲区对象的一部分(或者全部)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
参数:
target : 指定缓冲区对象的类型,具体类型参考 glBufferData
internalformat : 指定缓冲区对象中的数据的内部存储格式
offset:指定需要替换数据的偏移量(以字节计算)
size:指定需要填充的数据的大小(以字节计算)
format:指定内存中的数据的格式
type:指定类存中数据的类型
data:指定内存中的数据,用来替换掉缓冲区对象中的数据
上述参数中有几个概念需要明确:
1. internalformat: 用来表述缓冲区对象中的数据是那种形式的,可选的取值有:
内部格式 | 数据类型 | 组成成分 | 是否单位化 | 成分(0,1,2,3) |
---|---|---|---|---|
GL_R8 | ubyte | 1 | YES | R 0 0 1 |
GL_R16 | ushort | 1 | YES | R 0 0 1 |
GL_R16F | half | 1 | NO | R 0 0 1 |
GL_R32F | float | 1 | NO | R 0 0 1 |
GL_R8I | byte | 1 | NO | R 0 0 1 |
GL_R16I | short | 1 | NO | R 0 0 1 |
GL_R32I | int | 1 | NO | R 0 0 1 |
GL_R8UI | ubyte | 1 | NO | R 0 0 1 |
GL_R16UI | ushort | 1 | NO | R 0 0 1 |
GL_R32UI | uint | 1 | NO | R 0 0 1 |
GL_RG8 | ubyte | 2 | YES | R G 0 1 |
GL_RG16 | ushort | 2 | YES | R G 0 1 |
GL_RG16F | half | 2 | NO | R G 0 1 |
GL_RG32F | float | 2 | NO | R G 0 1 |
GL_RG8I | byte | 2 | NO | R G 0 1 |
GL_RG16I | short | 2 | NO | R G 0 1 |
GL_RG32I | int | 2 | NO | R G 0 1 |
GL_RG8UI | ubyte | 2 | NO | R G 0 1 |
GL_RG16UI | ushort | 2 | NO | R G 0 1 |
GL_RG32UI | uint | 2 | NO | R G 0 1 |
GL_RGB32F | float | 3 | NO | R G B 1 |
GL_RGB32I | int | 3 | NO | R G B 1 |
GL_RGB32UI | uint | 3 | NO | R G B 1 |
GL_RGBA8 | uint | 4 | YES | R G B A |
GL_RGBA16 | short | 4 | YES | R G B A |
GL_RGBA16F | half | 4 | NO | R G B A |
GL_RGBA32F | float | 4 | NO | R G B A |
GL_RGBA8I | byte | 4 | NO | R G B A |
GL_RGBA16I | short | 4 | NO | R G B A |
GL_RGBA32I | int | 4 | NO | R G B A |
GL_RGBA8UI | ubyte | 4 | NO | R G B A |
GL_RGBA16UI | ushort | 4 | NO | R G B A |
GL_RGBA32UI | uint | 4 | NO | R G B A |
format和type指定了data中的格式类型
format : 可以取值
GL_RED, GL_RG, GL_RGB,GL_RGBA 来代表一维、二维、三维或四维的数据
type: 指定了数据的类型是GL_FLOAT或者GL_INT或者GL_UNSIGNED_BYTE等
data: 指定用来填充的数据,如果是NULL那么该缓冲区由offset和size指定的区域会被0填充
glCopyBufferSubData将数据从一个缓冲区拷贝到另一个缓冲区
函数原型:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
参数描述:
readTarget : 源数据的缓冲区类型
writeTarget: 目标数据的缓冲区类型
readOffset: 源数据缓冲区中的数据偏移量(以字节为单位)
writeOffset: 目标数据缓冲区中的数据偏移量(以字节为单位)
size:拷贝的字节数
备注:
1. 拷贝的时候源数据与目标数据不可以出现重叠
2. 拷贝的时候目标数据的缓冲区大小与offset偏移量必须可以容纳源数据的拷贝数据大小