填充和复制数据缓冲区

  

周一到周五,每天一篇,北京时间早上7点准时更新~

  

后为缓冲区对象分配存储空间使用glBufferStorage ()、alt="填充和复制数据缓冲区">
一旦您的数据被发送到GPU,完全有可能你可能想缓冲区之间共享数据或结果从一个缓冲区复制到另一个。OpenGL的提供了一个易于使用的方式这样做。glCopyBufferSubData()和glCopyNamedBufferSubData()允许您指定缓冲区大小以及涉及补偿使用。

  

当你把数据发送给GPU后,你可能希望与其他缓冲共享数据或者是从一个缓冲拷贝数据到另一个buffer.OpenGL提供的对应的API是glCopyBufferSubData和glCopyNamedBufferSubData,他们的定义如下

  

空白glCopyBufferSubData (GLenum readtarget,
GLenum writetarget,
GLintptr readoffset,
GLintptr writeoffset,
GLsizeiptr大小),
空白glCopyNamedBufferSubData (GLuint readBuffer,
GLuint writeBuffer,
GLintptr readoffset,
GLintptr writeoffset,
GLsizeiptr大小),
为glCopyBufferSubData (), readtarget和writetarget两个缓冲区的目标你想绑定之间复制数据。它们可以缓冲绑定到任何可用的缓冲区绑定点。然而,由于缓冲绑定点一次只能有一个缓冲区约束,你不能复制两个缓冲都绑定到GL_ARRAY_BUFFER目标,例如。因此,当您执行复制,你需要选择两个目标结合缓冲区,这将扰乱OpenGL状态。

  

glCopyBufferSubData的数据读取地址和数据写入地址只某个绑定的节点而不是缓冲对象本身的标记。然而每个特定的绑定节点只能绑定一个缓冲区,所以你无法将两个都绑定在GL_ARRAY_BUFFER上的缓冲进行数据拷贝。所以,在你要拷贝的时候,你需要将缓冲区绑定到两个绑定节点上去,然后执行拷贝操作,这实际上会扰乱OpenGL状态机

  

来解决这个问题,OpenGL提供GL_COPY_READ_BUFFER和GL_COPY_WRITE_BUFFER目标。这些目标被添加专门允许您将数据从一个缓冲区复制到另一个没有任何意想不到的副作用。因为他们不用于任何其他在OpenGL,你可以绑定你的读写缓冲区这些绑定点而不影响其他任何缓冲目标。

  

为了实现这一目标,OpenGL提供两个专门的绑定节点,GL_COPY_READ_BUFFER和GL_COPY_WRITE_BUFFER,这俩节点能执行缓冲间的数据拷贝,并且没有什么副作用,因为这俩货除了具备拷贝功能以外不会有其他功能,所以你执行缓冲间拷贝的时候,改变这俩个节点的状态不会影响到其他的OpenGL的逻辑。

  

或者,您可以使用glCopyNamedBufferSubData()形式,直接将两个缓冲区的名称。当然,您可以指定相同的缓冲readBuffer和writeBuffer复制两个地区之间的数据偏移量相同的缓冲区对象。小心被复制的区域不重叠,不过,在这种情况下复制的结果是未定义的。您可以考虑glCopyNamedBufferSubData()作为一种缓冲对象的C函数memcpy。

  

同样的,你可以使用第二个glCopyNamedBufferSubData,直接传入写数据的地址和读数据的地址。你同样可以指定写入和读取的是同一个缓冲区,并在缓冲区内的不同区域内进行数据的拷贝。你可以把这个函数想象成为memcpy

  

readoffset和writeoffset参数告诉OpenGL的源和目标缓冲区读或写数据,和大小参数告诉它应该多大副本。确保你阅读和写作的范围内保持缓冲区的边界;否则,您的副本将会失败。writeoffset,你可能会注意到readoffset的类型和大小,GLintptr GLsizeiptr。这些类型是一个特殊的整数类型的定义,至少大得足以容纳一个指针变量

  

readoffset和writeoffset告诉OpenGL读地址和写地址的数据偏移位置.size告诉OpenGL拷贝数据的大小。你必须保证别越界了,否则你的拷贝会失败。你可能注意到了GLintptr和GLsizeiptr,这些数据都是整型的数据,它们对于标记指针的地址来说已经足够大了。

  

本日的翻译就到这里,明天见,拜拜~ ~

  

第一时间获取最新桥段,请关注东汉书院以及图形之心公众号

  

东汉书院,等你来玩哦

填充和复制数据缓冲区