用于读写的OpenGL缓冲区使用

用于读写的OpenGL缓冲区使用,opengl,buffer,Opengl,Buffer,众所周知,OpenGL的glBufferData函数中的用法标志只是一个提示,而不是一个真正的限制,文档中说“DRAW”表示“用户写入它,然后使用它作为参数传递给其他OpenGL函数”,而“READ”表示“此缓冲区将填充来自GL的数据,用户希望从中读取数据。”但是,如果我想,就像假设的用途一样,使用GPU作为外部存储,然后简单地从同一缓冲区写入和读取数据(可能在GL对其进行更改之后) 这些常量的位值并不表示我可以组合它们(如GL_DYNAMIC\u READ | GL_DYNAMIC\u DRA

众所周知,OpenGL的
glBufferData
函数中的用法标志只是一个提示,而不是一个真正的限制,文档中说“DRAW”表示“用户写入它,然后使用它作为参数传递给其他OpenGL函数”,而“READ”表示“此缓冲区将填充来自GL的数据,用户希望从中读取数据。”但是,如果我想,就像假设的用途一样,使用GPU作为外部存储,然后简单地从同一缓冲区写入和读取数据(可能在GL对其进行更改之后)

这些常量的位值并不表示我可以组合它们(如
GL_DYNAMIC\u READ | GL_DYNAMIC\u DRAW

是否有任何“最佳”使用标志可用于提示GL“我想将该缓冲区用作读取和写入的存储”

如果我想,就像一个假设的用途一样,使用GPU作为外部存储,然后简单地从同一个缓冲区写入和稍后读取(可能在GL对其进行更改之后)

然后,要么你不再关心使用提示,要么你不使用OpenGL。OpenGL的缓冲区对象是为了OpenGL的使用而存在的。它们不是为了让你访问一个新的内存池

特别是因为“内存池*很可能是malloc等从中分配的相同内存池。在OpenGL中,您无法确保缓冲区对象的存储来自GPU内存(甚至无法检查GPU是否有专用内存)

简而言之,这不是OpenGL要支持的使用模式,因此它不能很好地支持它

如果我想,就像一个假设的用途一样,使用GPU作为外部存储,然后简单地从同一个缓冲区写入和稍后读取(可能在GL对其进行更改之后)

然后要么停止关注使用提示,要么不使用OpenGL。OpenGL的缓冲区对象是为了OpenGL的使用而存在的。它们并不是为了让你访问一个新的内存池

特别是因为“内存池*很可能是malloc等从中分配的同一个内存池,而且在OpenGL中,您无法确保缓冲区对象的存储来自GPU内存(甚至检查GPU是否有专用内存)

简而言之,这不是OpenGL要支持的一种使用模式,因此它不太支持它。

虽然在OpenCL被引入之前,OpenGL不是被“误用”为并行计算解决方案,基本上就是这样做的吗?也许你从那时起就知道一些事情哦,强大的龙之神。@salbeira:在OpenCL被引入之前,OpenGL不是被“误用”为并行计算解决方案吗?“不是。计算操作使用GPU操作读取或写入该缓冲区。是的,CPU也可以读取或写入该缓冲区,但这些读取的目的是读取计算结果,而写入的目的是写入源计算数据。您所说的只是使用缓冲区来增加CPU存储。这不是它的目的。尽管在OpenCL被引入之前,OpenGL不是被“误用”为并行计算解决方案吗?也许你从那天起就知道了一些事情哦,强大的龙之神。@salbeira:“在OpenCL被引入之前,OpenGL不是被“误用”为并行计算解决方案吗?”不。计算操作使用GPU操作读取或写入缓冲区。是的,CPU也可以读取或写入该缓冲区,但这些读取的目的是读取计算结果,而写入的目的是写入源计算数据。您所说的只是使用缓冲区来增加CPU存储。这不是它的目的。