OpenGL缓冲对象:glBindBufferRange、glBindBufferBase、glBindBuffersBase、glBindBuffersRange简介

OpenGL缓冲对象:glBindBufferRange、glBindBufferBase、glBindBuffersBase、glBindBuffersRange简介

OpenGL缓冲对象概念缓冲区对象 Buffer Objects API列表

缓冲区对象 Buffer Objects创建和绑定缓冲区对象 Creating and Binding Buffer Objects创建缓冲对象数据存储 Creating Buffer Object Data Stores修改缓冲对象数据存储 Modifying Buffer Object Data StoresClear缓冲对象数据存储 Clear Buffer Object Data Stores映射映射缓冲数据 Mapping Buffer Data刷新映射缓冲数据 Flush Buffer Data取消映射缓冲数据 Unmapping Buffer Data使缓冲区数据无效 Invalidating Buffer Data缓冲区间复制 Copying Between Buffers缓冲对象查询 Buffer Object Queries

glBindBufferRange 和 glBindBufferBase 是 OpenGL 中用于将缓冲对象绑定到特定目标数组的索引位置或通用绑定点的函数,这些目标包括:ATOMIC_COUNTER_BUFFER、SHADER_STORAGE_BUFFER、TRANSFORM_FEEDBACK_BUFFER 或 UNIFORM_BUFFER。

对于 glBindBufferRange 函数:

void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);

target 必须是上述四种目标类型之一。index 指定了着色器程序中对应缓冲区绑定点的索引。buffer 是要绑定的缓冲对象标识符。offset 指定从缓冲对象内部的偏移量开始绑定数据,单位为基本机器单元(字节)。size 指定了在作为索引目标使用时可以从该缓冲对象读取或写入的数据量,同样以基本机器单元计数。

当调用 glBindBufferRange 时,只会绑定缓冲对象中从 offset 开始且大小为 size 的一部分。如果试图访问超出这个范围的数据,OpenGL 将确保不会越界,即使没有错误也会限制在有效范围内。

对于 glBindBufferBase 函数:

void glBindBufferBase(GLenum target, GLuint index, GLuint buffer);

这个函数与 glBindBufferRange 类似,但它是将整个缓冲对象绑定到指定的目标和索引上。当调用 glBindBufferBase 绑定缓冲对象时,无论缓冲对象后续是否改变大小,都会绑定整个缓冲,并且起始偏移量始终为0,可以访问的缓冲大小取决于绑定时缓冲的实际大小。

不论是 glBindBufferRange 还是 glBindBufferBase,它们都打破了之前对通用绑定点或数组中相同索引处的任何绑定,并在成功绑定后不改变已绑定缓冲对象的状态。如果提供的缓冲对象尚未被绑定过,OpenGL 会为其创建一个新的状态向量,并初始化一个零大小的内存缓冲区,其包含所有相关状态并具有初始值。

对于 glBindBuffersBase 函数:

void glBindBuffersBase( enum target, uint first, sizei count, const uint *buffers );

等价于

for (i = 0; i < count; i++) {

if (buffers == NULL) {

glBindBufferBase(target, first + i, 0);

} else {

glBindBufferBase(target, first + i, buffers[i]);

}

}

对于 glBindBuffersRange 函数:

void glBindBuffersRange( enum target, uint first, sizei count, const uint *buffers, const intptr *offsets, const sizeiptr *sizes );

等价于

for (i = 0; i < count; i++) {

if (buffers == NULL) {

glBindBufferRange(target, first + i, 0, 0, 0);

} else {

glBindBufferRange(target, first + i, buffers[i],offsets[i], sizes[i]);

}

}

你可能也喜欢

如何调鼠标的灵敏度 快速调节超简单
beat365中文官网

如何调鼠标的灵敏度 快速调节超简单

📅 07-02 👀 2124
抽油烟机坏了能维修吗怎么办?专业指南与实用解决方案
手机拍照软件推荐与使用指南
36500365体育在线投注

手机拍照软件推荐与使用指南

📅 06-27 👀 6552
格林春天环保集成墙饰怎么样?
365bet官网地址

格林春天环保集成墙饰怎么样?

📅 06-30 👀 6206
阿里云无影云手机价格怎么收费?云手机功能好用吗?
PTR记录(Pointer Record)
beat365中文官网

PTR记录(Pointer Record)

📅 07-06 👀 1484