我们如何从GLSL获得变量值?

时间:2012-06-19 03:18:40

标签: c glsl

我正在做一个有大量计算的项目,我有一个想法是把工作扔给GPU,但我想知道我们是否可以从GLSL检索结果,如果它是可行的,怎么样?

2 个答案:

答案 0 :(得分:4)

除了帧缓冲区中的内容之外,GLSL不提供输出。

要编程GPU并更方便地获得结果,请使用CUDA(仅限NVidia)或OpenCL(跨平台)。

答案 1 :(得分:3)

通常,您要做的是将OpenCL用于通用GPU任务。但是,如果您坚持假装OpenGL不是渲染API ......

Framebuffer Objects使渲染到多个输出变得相对容易。这当然意味着您必须构建您的处理,以便呈现的内容与您想要的匹配。您可以渲染到32位浮点“图像”,因此您可以获得足够的精度。最大的困难在于我所说的:弄清楚如何构建你的任务以匹配渲染。

使用变换反馈时更容易一些。这是将顶点(或几何)着色器处理的输出写入buffer object的能力。这仍然需要将您的任务结构化为渲染,但它更容易,因为顶点着色器具有严格的一个顶点到一个顶点的映射。对于每个输入顶点,只有一个输出。如果你绘制GL_POINTS,使用属性传递更改的数据并不困难。

使用shader_image_load_store既容易又困难。这实际上是“随时随地”读取/写入任意图像的能力。我把最后一部分放在引号中,因为有很多关于数据竞争条件的深奥规则:从另一个着色器调用写入的值读取,等等。这些无关紧要。您可以尝试构建代码以避免它们,方法是不在同一着色器中写入相同的图像位置。但在许多情况下,如果你能做到这一点,你可以只渲染到帧缓冲区。

最终,在一般情况下回答这个问题几乎是不可能的,而不知道你正在尝试实际做什么 。如何通过渲染API处理GPGPU很大程度上取决于您正在尝试计算的内容。