Opengl 将缓冲区用作着色器存储缓冲区,然后用作原子计数器缓冲区是否合适?

Opengl 将缓冲区用作着色器存储缓冲区,然后用作原子计数器缓冲区是否合适?,opengl,glsl,Opengl,Glsl,我正在使用一个原子计数器,它有自己的缓冲区,我想在其他过程中清除该计数器。那么,将缓冲区绑定为着色器存储缓冲区以清除缓冲区,然后在第二个过程中将其用作原子计数器缓冲区,这是否好呢?另外,我想问一下,在同一着色器中同时使用与着色器存储缓冲区和原子计数器缓冲区相同的缓冲区是否可以,比如说,开始时的4个字节仅用于原子计数器,而在同一缓冲区中是读取/修改的其他数据。您可以对不同的目标使用相同的缓冲区,但是您必须自己管理对齐要求(名称中包含glGet和alignment的所有参数) 然后,您可以使用Inv

我正在使用一个原子计数器,它有自己的缓冲区,我想在其他过程中清除该计数器。那么,将缓冲区绑定为着色器存储缓冲区以清除缓冲区,然后在第二个过程中将其用作原子计数器缓冲区,这是否好呢?另外,我想问一下,在同一着色器中同时使用与着色器存储缓冲区和原子计数器缓冲区相同的缓冲区是否可以,比如说,开始时的4个字节仅用于原子计数器,而在同一缓冲区中是读取/修改的其他数据。

您可以对不同的目标使用相同的缓冲区,但是您必须自己管理对齐要求(名称中包含
glGet
alignment
的所有参数)

然后,您可以使用
InvalidateBufferSubData
作为性能提示使范围无效(GPU不必保留要清除的内容),并使用
ClearBufferSubData
清除范围


为了获得更好的性能,我建议对原子计数器或任何经常清除或更新的数据使用双缓冲或三缓冲。

我不太明白您所说的计数器的双缓冲或三缓冲是什么意思。您的意思是对同一计数器使用例如2个缓冲区,这些缓冲区在连续着色器调用时交换吗?我不知道这应该如何提高性能,因为我无论如何都需要清除这两个选项。你能告诉我glClearBuffer调用与一个线程的顶点着色器(仅清除4个字节)相比有多高效吗?@FamZ:“你能告诉我glClearBuffer调用与一个线程的顶点着色器(仅清除4个字节)相比有多高效吗?”。。。什么?想想看。其中之一是一个简单的命令。另一个是调用渲染过程。即使GPU没有专门用于写入GPU内存的命令,最坏的情况是GPU调用计算着色器来进行写入。这仍然比VS示例更好。@FamZ使用多个缓冲区意味着您可以在使用当前计数器时清除下一个计数器。由于这两个计数器彼此独立,所以实现不必等待计数器被清除后再对其进行操作。因此,如果我理解正确,如果我通过调用glClearBufferData来清除缓冲区,然后启动一些着色器程序,这意味着缓冲区可能在那一刻还没有被清除。但是,为什么在清除缓冲区后不需要调用glMemoryBarrier()?我很抱歉问这样的问题,但我不知道这样的东西到底是如何工作的…
glMemoryBarrier
只对着色器写入是必需的。除了需要
glUnmapBuffer
glFlushMappedBufferRange
的非一致映射之外,主机写入对于后续操作是可见的。