13

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

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

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

谢谢

4

4 回答 4

7

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

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

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

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

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

于 2010-10-12T13:18:59.877 回答
2

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

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

于 2010-10-12T13:12:16.913 回答
1

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

于 2014-09-24T22:17:07.253 回答
0

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

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

于 2010-10-12T13:11:58.753 回答