glBufferSubData | glClearBufferSubData | glCopyBufferSubData

来源:互联网 发布:php魔术常量有哪些 编辑:程序博客网 时间:2024/05/22 04:52

glBufferSubData

glBufferSubData用来更新一个已有缓冲区对象中的一部分数据

void glBufferSubData(       GLenum target,    GLintptr offset,    GLsizeiptr size,    const GLvoid * data);
  • 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 用一个固定的值填充缓冲区对象的一部分(或者全部)

OpenGL >= 4.3void glClearBufferSubData(      GLenum target,    GLenum internalformat,    GLintptr offset,    GLsizeiptr size,    GLenum format,    GLenum type,    const void * data);
  • 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_R8ubyte1YESR 0 0 1GL_R16ushort1YESR 0 0 1GL_R16Fhalf1NOR 0 0 1GL_R32Ffloat1NOR 0 0 1GL_R8Ibyte1NOR 0 0 1GL_R16Ishort1NOR 0 0 1GL_R32Iint1NOR 0 0 1GL_R8UIubyte1NOR 0 0 1GL_R16UIushort1NOR 0 0 1GL_R32UIuint1NOR 0 0 1GL_RG8ubyte2YESR G 0 1GL_RG16ushort2YESR G 0 1GL_RG16Fhalf2NOR G 0 1GL_RG32Ffloat2NOR G 0 1GL_RG8Ibyte2NOR G 0 1GL_RG16Ishort2NOR G 0 1GL_RG32Iint2NOR G 0 1GL_RG8UIubyte2NOR G 0 1GL_RG16UIushort2NOR G 0 1GL_RG32UIuint2NOR G 0 1GL_RGB32Ffloat3NOR G B 1GL_RGB32Iint3NOR G B 1GL_RGB32UIuint3NOR G B 1GL_RGBA8uint4YESR G B AGL_RGBA16short4YESR G B AGL_RGBA16Fhalf4NOR G B AGL_RGBA32Ffloat4NOR G B AGL_RGBA8Ibyte4NOR G B AGL_RGBA16Ishort4NOR G B AGL_RGBA32Iint4NOR G B AGL_RGBA8UIubyte4NOR G B AGL_RGBA16UIushort4NOR G B AGL_RGBA32UIuint4NOR 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将数据从一个缓冲区拷贝到另一个缓冲区

函数原型:

void glCopyBufferSubData(       GLenum readTarget,    GLenum writeTarget,    GLintptr readOffset,    GLintptr writeOffset,    GLsizeiptr size);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数描述:

readTarget : 源数据的缓冲区类型 
writeTarget: 目标数据的缓冲区类型 
readOffset: 源数据缓冲区中的数据偏移量(以字节为单位) 
writeOffset: 目标数据缓冲区中的数据偏移量(以字节为单位) 
size:拷贝的字节数

备注: 
1. 拷贝的时候源数据与目标数据不可以出现重叠 
2. 拷贝的时候目标数据的缓冲区大小与offset偏移量必须可以容纳源数据的拷贝数据大小

0 0
原创粉丝点击