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

5

我有一个关于计算着色器的问题。在DX 9中是否有计算着色器?如果GPU上没有计算着色器片段,是否仍然可以使用DX9驱动程序来使用计算着色器呢?(根据IMG的说法,SGX 545没有它,但是SGX 6X代将会有)我想知道是否可以在DirectX9或OpenGL驱动程序上对SGX GPU进行一些简单的通用编程。

此外,我是否可以使用OpenGL顶点着色器进行GPGPU编程?我的想法是:我将我的矩阵/数据加载到顶点缓冲区中,并将它们绑定到程序上下文中。我将一些其他静态变量加载到统一变量中,并将我的实际计算程序加载到顶点着色器中。到这个地方看起来可行(是吗?),但是顶点着色器的输出将通过光栅化并馈送到片段着色器中(根据OpenGL中事物的处理方式)。是否有任何方法可以防止数据通过整个图形管线,或者可以在顶点着色器执行完成后拦截,以某种方式读取值和执行所需的时间?

2个回答

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

3
我非常喜欢这种方法,因为它允许在一些意想不到的环境(如WebGL)中进行大量的GPGPU工作。如果您可以将算法结构化,以便其在不支持浮点渲染目标的实现中表现良好,那么您会惊讶于有多少设备能够进行GPGPU。由于OpenGL ES 2.0不支持变换反馈,我认为解决这个问题的唯一可移植方法是像您所说的那样使用顶点着色器阶段作为简单的透传,然后在片段着色器中完成工作。 - Andon M. Coleman
3
使用片段状态进行计算的一个缺点是:它不允许执行散射写操作,这可能对某些算法造成问题。根据您实际想要做什么,您可以使用顶点着色器阶段执行“散射”计算,发出单个像素点的位置,并让片段着色器执行本地化计算。 - datenwolf
@darius:仍然可以关闭选定变量的插值。 - datenwolf
@datenwolf 使用顶点着色器来进行散射写入是一个非常好的解决方案。这对我来说真的非常有用。谢谢。 - darius
@darius 非常感谢。是否有教程,或者可以帮助我入门的示例程序之类的东西?我是OpenGL的初学者。 - sai pallavi
@user2755509 如果您是初学者,我建议您先学习如何使用GLSL进行图形处理(即使只是作为一种练习),以便更好地理解您将要使用的工具。一个很好的起点是阅读这些教程http://www.opengl-tutorial.org/beginners-tutorials/,然后专注于一些后期处理技术,或者如果有足够的时间,可以学习延迟渲染。这里有一个很好的教程供参考http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html。 - darius

3

有没有办法防止数据经过整个图形管道,或者在顶点着色器执行后拦截并读取执行时间和值?

有。
你可以使用顶点着色器进行计算,关闭镶嵌阶段和几何着色器,并从变换反馈中拦截结果。

下面是OpenGL渲染管线

可选阶段有条纹边框。
可编程阶段为蓝色。

OpenGL Rendering Pipeline


1
事实上,您可以通过将每个顶点的W坐标设置为0.0来简化光栅化过程。理论上,透视除法会导致这些顶点被剪裁。当然,如果您想要使用W进行有意义的操作,那就没办法了 :) 不幸的是,这并不能解决OpenGL ES的困境,因为ES和ES 2.0没有变换反馈。 - Andon M. Coleman
@DylanHolmes:非常感谢。你的意思是说我也可以关闭像素着色器吗?有没有办法从变换反馈中读取数据?是否有任何教程或示例程序之类的东西可供参考,帮助我入门?我是OpenGL的初学者。 - sai pallavi
您可以通过将每个顶点的w坐标设置为0来“关闭”像素着色器,就像@AndonM.Coleman在上面所说的那样。一个很好的入门教程是http://www.opengl-tutorial.org/。 - Dylan Holmes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接