使用着色器进行计算

时间:2010-10-12 13:07:16

标签: glsl data-transfer shader

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

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

这就是我考虑这个问题的方式,虽然可能有其他方式,这对我来说是不可知的。如果有人能解释我的话,我会很高兴,因为我刚读了一些关于GLSL的书,现在我想编写更复杂的着色器,我不想放松目前不可能的方法。 / p>

由于

4 个答案:

答案 0 :(得分:7)

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

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

为此目的创建了一些工具,最明显的是 OpenCL CUDA 。它们极大地帮助了GPGPU,因此这种编程几乎就像CPU编程一样。

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

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

答案 1 :(得分:2)

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

这些是用于计算显卡内容的特殊库。我不会使用普通的3D API,虽然可以通过一些解决方法。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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