- 缓冲区对象 Buffer Objects
- 创建和绑定缓冲区对象 Creating and Binding Buffer Objects
- 创建缓冲对象数据存储 Creating Buffer Object Data Stores
- 修改缓冲对象数据存储 Modifying Buffer Object Data Stores
- Clear缓冲对象数据存储 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]);
}
}