使用着色器进行计算

Posted

技术标签:

【中文标题】使用着色器进行计算【英文标题】:Using shader for calculations 【发布时间】:2011-04-24 07:41:53 【问题描述】:

是否可以使用着色器计算一些值,然后将它们返回以供进一步使用?

例如,我将网格发送到 GPU,并带有一些关于如何修改(更改顶点位置)的参数,然后取回生成的网格?我认为这是不可能的,因为我没有看到任何从着色器到 CPU 的通信变量。我正在使用 GLSL,所以只有统一、属性和变化。我应该使用属性还是统一,渲染后它们仍然有效吗?我可以更改这些变量的值并将它们读回 CPU 吗?在 GPU 中有映射数据的方法,但这些方法会被更改且有效吗?

这就是我正在考虑的方式,尽管可能还有其他方式,这对我来说是未知的。如果有人能给我解释一下,我会很高兴,因为我刚刚阅读了一些关于 GLSL 的书,现在我想编写更复杂的着色器,并且我不想缓解目前不可能的方法。

谢谢

【问题讨论】:

【参考方案1】:

现在您可以使用 OpenGL 中的着色器缓冲区对象在着色器中写入可在主机中读取的值。

【讨论】:

【参考方案2】:

好问题!欢迎来到图形处理单元通用计算的勇敢新世界 (GPGPU)。

使用像素着色器可以实现您想要做的事情。您加载纹理(即:数据),应用着色器(进行所需的计算),然后使用 Render to Texture 将生成的数据从 GPU 传递到主内存 (RAM)。

为此创建了一些工具,最著名的是 OpenCLCUDA。它们极大地帮助了 GPGPU,因此这种编程看起来几乎像 CPU 编程。

它们不需要任何 3D 图形经验(尽管仍然是首选 :))。您不需要对纹理进行任何技巧,只需将数组加载到 GPU 内存中即可。处理算法是用稍微修改过的 C 语言编写的。最新版本的 CUDA 支持 C++。

我建议从CUDA开始,因为它是最成熟的:http://www.nvidia.com/object/cuda_home_new.html

【讨论】:

正如 testalino 所写,CUDA 是特定于 nVidia 的。当我在运行 Radeon 时,我不会遇到速度变慢的问题,或者甚至可以在 Radeon 上运行 CUDA 吗? OpenCL 是不是效果较差,或者为什么不建议先使用它? @Raven 是的,CUDA 完全是 nVidia 特定的。如果让我选择,我会更喜欢 CUDA+nVidia。既然你有 ATI,你就必须选择 OpenCL。据我所知,CUDA 更成熟,工具更好等。在性能方面,我认为没有显着差异。 @Raven,如果我已经使用 Direct X,我会选择 Direct Compute,如果我使用的是 Open GL,我会选择 Open CL。出于上述原因,我永远不会使用 CUDA。您无法确保使用您的应用程序的每个人都拥有 NVIDIA 卡。 感谢您的意见。由于您所说的原因,因为我讨厌那些我无法完全玩的 physx 游戏 + 我正在学习 openGL 而不是 CG 或 DirectX,我认为 openCL 最适合我的需求。 @Raven 如果你有 ATI 那么这是唯一的选择。【参考方案3】:

这在使用 Open CL、Microsoft Direct Compute(DirectX 11 的一部分)或 CUDA 的现代显卡上很容易实现。使用普通着色器语言(例如 GLSL、HLSL)。前两个适用于 Nvidia 和 ATI 显卡,cuda 是 nvidia 独有的。

这些是用于计算显卡上的东西的特殊库。我不会为此使用普通的 3D API,尽管有一些解决方法是可能的。

【讨论】:

【参考方案4】:

我最好的猜测是将您发送到BehaveRT,这是一个为利用 GPU 进行行为模型而创建的库。我认为如果你可以在库中制定你的修改,你可以从它的抽象中受益

关于你的cpu和gpu之间来回传递的数据,我会让你浏览文档,我不确定

【讨论】:

以上是关于使用着色器进行计算的主要内容,如果未能解决你的问题,请参考以下文章

GLSL:使用片段着色器进行对象翻译

如何使用计算着色器计算值并将它们存储在 3D 纹理中?

一次调用可以在 glsl 计算着色器中进行乒乓传播吗?

OpenGL4.3新特性: 计算着色器 Compute Shader

奇怪的计算着色器延迟

[OpenGL] 使用计算着色器进行预烘焙