检索某些顶点到CPU的最快跨平台方法是什么?

问题描述 投票:0回答:1

我正在开发一个应用程序,我将相机姿势传递给GPU,后者将生成包含关于对象的可见椎体的不同信息的纹理(法线深度......)基于这些信息,我想选择一些顶点然后去通过生成的纹理将这些顶点的所有信息检索到CPU中。

我做了一些阅读,最好的方法似乎是使用Trasform反馈。然而,许多人似乎不赞成像the last comment herethis blog并选择计算着色器。

opengl glsl gpgpu
1个回答
0
投票

Transform feedback机制不是你的解决方案。它有利于捕获GPU上的当前数据状态并更新它以进行GPU上的下一次绘制调用,而无需为了数据更新而执行GPU到CPU并返回乒乓。 Particles rendering是变换反馈的流行用例之一。您还没有说出您的目标平台是什么,因此很难理解您的硬件限制/功能,但是这里有几种方法可以下载主机(CPU)更新而不会拖延渲染管道:

  1. 使用PBO ping-pong。如果您可以将数据写入纹理,则可以使用像素缓冲对象来download as well as upload from/to GPU asynchronously。如果你阅读了链接中的文档,你也可以看到你可以使用共享上下文进行线程传输。这些技术可以大大加快传输时间。
  2. 如果您使用缓冲区,并且可以访问持久映射功能(OpenGL 4.4),您可以尝试双倍甚至三倍缓冲,这是一种如上所述的“PBO乒乓”,但使用缓冲区。 Here详细解释了这个概念,但一般的想法是持久地映射使用大小的3x缓冲区,并且每个帧从主机上的3个部分之一读取,同时写入设备上的3个部分中的另一个。 GPU,probably通过DMA可以看到固定的内存块,虽然通常持久映射缓冲区的速度不比常规映射缓慢,但它们确实可以显着降低每次帧更新的驱动程序开销。
  3. 重型经典就像在单独的线程中使用CUDA或OpenCL一样。我不知道OpenCL是如何完成的,但是使用CUDA,您可以在单独的线程中设置CUDA上下文,将GL resource(如缓冲区或纹理)映射到CUDA拥有的资源,然后使用Producer - Consumer范例读取数据从CUDA映射的GL缓冲区进行托管,同时在OpenGL线程中继续渲染。当然,在将线程映射到CUDA上下文时,您必须在线程之间将其作为OpenGL shouldn't access缓冲区进行同步,因为这种访问的结果将是未定义的。

我个人会选择2 +使用共享上下文和线程来持久映射指针以便读取数据。它有同步的复杂性,但如果做得对,可以提供非常快速的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.