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

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

  1. 缓冲区对象 Buffer Objects
  2. 创建和绑定缓冲区对象 Creating and Binding Buffer Objects
  3. 创建缓冲对象数据存储 Creating Buffer Object Data Stores
  4. 修改缓冲对象数据存储 Modifying Buffer Object Data Stores
  5. Clear缓冲对象数据存储 Clear Buffer Object Data Stores
  6. 映射映射缓冲数据 Mapping Buffer Data
  7. 刷新映射缓冲数据 Flush Buffer Data
  8. 取消映射缓冲数据 Unmapping Buffer Data
  9. 使缓冲区数据无效 Invalidating Buffer Data
  10. 缓冲区间复制 Copying Between Buffers
  11. 缓冲对象查询 Buffer Object Queries

glBindBufferRangeglBindBufferBase 是 OpenGL 中用于将缓冲对象绑定到特定目标数组的索引位置或通用绑定点的函数,这些目标包括:ATOMIC_COUNTER_BUFFERSHADER_STORAGE_BUFFERTRANSFORM_FEEDBACK_BUFFERUNIFORM_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]);
    }
}

你可能感兴趣的:(OpenGL,图形渲染)