glBufferSubData | glClearBufferSubData | glCopyBufferSubData

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.3
void 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_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将数据从一个缓冲区拷贝到另一个缓冲区

函数原型:

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偏移量必须可以容纳源数据的拷贝数据大小

要绘制圆形,可以使用三角扇或三角形条带来逼近圆形。以下是使用三角扇绘制圆形的示例代码: ``` void drawCircle() { const int numSegments = 32; // 圆形的线段数 const float radius = 1.0f; // 圆形半径 // 顶点坐标和颜色数组 GLfloat vertices[(numSegments + 2) * 3]; GLfloat colors[(numSegments + 2) * 3]; // 圆心点 vertices[0] = 0.0f; vertices[1] = 0.0f; vertices[2] = 0.0f; colors[0] = 1.0f; colors[1] = 1.0f; colors[2] = 1.0f; // 计算圆周上的点的坐标和颜色 for (int i = 0; i <= numSegments; i++) { float angle = i * 2.0f * M_PI / numSegments; int offset = (i + 1) * 3; vertices[offset] = cos(angle) * radius; vertices[offset + 1] = sin(angle) * radius; vertices[offset + 2] = 0.0f; colors[offset] = 1.0f; colors[offset + 1] = 1.0f; colors[offset + 2] = 1.0f; } // 绘制三角扇 glBindBuffer(GL_ARRAY_BUFFER, buffer[VERTICES]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); glVertexPointer(3, GL_FLOAT, 0, 0); glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(vertices))); glDrawArrays(GL_TRIANGLE_FAN, 0, numSegments + 2); } ``` 注意到圆形的顶点数是固定的,因此在画圆形时不需要使用索引缓冲区。在顶点坐标和颜色数组中,第一个顶点是圆心,其它顶点按逆时针顺序排列在圆周上。最后使用 `glDrawArrays` 函数绘制三角扇即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值