使用顶点/像素着色器的通用计算(Open GL/DirectX)

sai*_*avi 5 opengl directx shader gpgpu opengl-es

我有一个关于计算着色器的问题.是否可以在DX 9中使用计算着色器?如果GPU上没有计算着色器片段,是否仍然可以使用带有DX9驱动程序的计算着色器?(就像IMG所说的那样,SGX 545没有它,但SGX 6X将会拥有它).我想知道如果我可以使用DirectX9或OpenGL驱动程序在SGXs GPU上进行一些简单的通用编程.

另外,无论如何我可以使用OpenGL顶点着色器进行GPGPU编程吗?这就是我的想法:我将我的矩阵/数据加载到顶点缓冲区,并将它们绑定到程序上下文.我将一些其他静态变量加载到统一变量中,并将我的实际计算程序加载到顶点着色器中.它到目前为止看起来都是可见的(是吗?)但是顶点着色器的输出将经过光栅化并将被提供给片段着色器(根据openGL中的内容).无论如何,我可以阻止数据通过整个图形pipleline,或者我可以在顶点着色器完成执行后拦截,并以某种方式读取值和执行时间?

dar*_*ius 4

无论如何,我可以使用 OpenGL 顶点着色器进行 GPGPU 编程吗?

从顶点着色器出来的东西通常在光栅化阶段进行插值。在旧版本的 openGL 中,您可以指定对于特定变量是否应该进行此类插值。我不知道你是否仍然可以这样做...是的,你仍然可以(感谢 datenwolf 的提示)...但在我看来,更好的方法是使用片段着色器。对于任何后期处理效果,使用简单的顶点着色器渲染覆盖整个帧(四边形)的两个三角形,渲染到全帧,并在片段着色器中进行计算。将要用作纹理输入的数据放入纹理中,并使用帧缓冲区对象 (FBO) 将结果渲染到其他纹理。

  • 我自己非常喜欢这种方法,因为它允许在真正意想不到的上下文中使用很多 GPGPU 东西(即 _WebGL_)。如果您可以构建您的算法,以便在不支持浮点渲染目标的实现中正常工作,您会惊讶地发现有多少设备支持 GPGPU。由于变换反馈在 OpenGL ES 2.0 中是不可能的,我认为可移植解决此问题的唯一方法是使用顶点着色器阶段作为简单的直通,就像您所说的那样,并在片段着色器中完成工作。 (3认同)
  • 嗯,使用片段状态进行计算有一个缺点:它不允许您执行分散写入,这对于某些算法来说可能是一个问题。根据您实际想要执行的操作,您可以使用顶点着色器阶段来执行“散射”计算,发出单个像素点的位置,并让片段着色器执行本地化计算。 (3认同)