gpt4 book ai didi

opengl - 在OpenGL中将GPU计算的结果返回给CPU程序

转载 作者:行者123 更新时间:2023-12-01 23:24:49 29 4
gpt4 key购买 nike

有没有办法将 GPU 上运行的着色器的结果返回到 CPU 上运行的程序?

我想根据 GPU 上计算成本较高的算法从简单体素数据生成多边形网格,但我需要 CPU 上的结果进行物理计算。

最佳答案

定义“结果”?

一般来说,如果您使用 OpenGL 进行 GPGPU 式计算,则需要围绕渲染系统的需求构建着色器。渲染系统被设计为单向的:数据进入其中并生成图像。回顾过去,让渲染系统生成数据通常并不是渲染系统的结构方式。

当然,这并不意味着您做不到。但您需要围绕 OpenGL 的限制来构建一切。

OpenGL 提供了许多 Hook ,您可以在其中从某些着色器阶段写入数据。其中大多数需要专门的硬件

片段着色器输出

任何支持片段着色器的硬件显然都允许您写入正在渲染的当前帧缓冲区。通过使用framebuffer objects以及浮点或整数纹理 image formats ,您几乎可以将任何您想要的数据写入各种图像。一旦进入纹理,您只需调用 glGetTexImage获取渲染后的像素数据。或者你也可以这样做glReadPixels如果 FBO 仍处于绑定(bind)状态,则获取它。无论哪种方式都有效。

此方法的主要局限性是:

  • 可以附加到帧缓冲区的图像数量;这限制了您可以写入的数据量。在 GL 3.x 之前的硬件上,FBO 通常仅限于 4 个图像加上一个深度/模板缓冲区。在 3.x 及更好的硬件中,您至少可以期待 8 个图像。

  • 您正在渲染的事实。这意味着您需要设置顶点数据以将三角形精确定位在您希望其修改数据的位置。这不是一件小事。获得有用的输入数据也很困难,因为您通常希望每个纹理像素彼此相当独立。围绕这些限制构建片段着色器是很困难的。并非不可能,但在许多情况下并非微不足道。

转换反馈

此 OpenGL 3.0 功能允许 Vertex Processing 的输出OpenGL 阶段(顶点着色器和可选的几何着色器)要在一个或多个缓冲区对象中捕获。

这对于捕获您想要使用或再次渲染的顶点数据来说更加自然。在您的情况下,您需要在渲染后将其读回,可能使用 glGetBufferSubData 调用,或者使用 glMapBufferRange 进行读取。

这里的限制是您通常只能捕获 4 个输出值,其中每个值都是 vec4。还有一些严格的布局限制。一些 OpenGL 3.x 和 4.x 硬件提供了将数据写入多个反馈流的能力,这些反馈流都可以写入不同的缓冲区。

图像加载/存储

这个 GL 4.2 功能代表了写入的巅峰:您可以绑定(bind)图像(缓冲区纹理,如果您想写入缓冲区),然后直接写入它。有memory ordering constraints您需要在其中工作。

它非常灵活,但也非常复杂。除了正确使用它的困难之外,它还存在许多限制。您可以写入的图像数量相当有限,可能是 8 个左右。并且实现可能有总写入限制,因此要写入的 8 个图像可能必须由片段着色器的输出共享。

此外,仅保证片段着色器(以及 4.3 的计算着色器)的图像输出。也就是说,硬件可以禁止您在非 FS/CS 着色器阶段使用图像加载/存储。

关于opengl - 在OpenGL中将GPU计算的结果返回给CPU程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14086926/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com