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

Opengl 使用顶点/像素着色器进行通用计算(Open GL/DirectX),opengl,opengl-es,directx,shader,gpgpu,Opengl,Opengl Es,Directx,Shader,Gpgpu,我有一个关于计算着色器的问题。DX 9中是否提供计算着色器?如果GPU上没有计算着色器片段,是否仍然可以将计算着色器与DX9驱动程序一起使用?(SGX545没有,但SGX6X一代会有),正如IMG所说。我想知道我是否可以使用DirectX9或OpenGL驱动程序在SGXs GPU上进行一些简单的通用编程 还有,我是否可以使用OpenGL顶点着色器进行GPGPU编程?以下是我的想法: 我将把矩阵/数据加载到顶点缓冲区,并将它们绑定到程序上下文。我将加载一些其他静态变量到统一变量中,并将我的实际计算

我有一个关于计算着色器的问题。DX 9中是否提供计算着色器?如果GPU上没有计算着色器片段,是否仍然可以将计算着色器与DX9驱动程序一起使用?(SGX545没有,但SGX6X一代会有),正如IMG所说。我想知道我是否可以使用DirectX9或OpenGL驱动程序在SGXs GPU上进行一些简单的通用编程

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

我是否可以使用OpenGL顶点着色器进行GPGPU编程

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

是否有任何方法可以阻止数据通过整个系统 图形管线,或者在顶点着色器完成后可以截取吗 通过执行,并以某种方式读取 处决

是的。
您可能会使用顶点着色器进行计算,关闭细分阶段和几何体着色器,并截取变换反馈的结果

下面是一个例子

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


事实上,您可能只需将每个顶点的W坐标设置为0.0即可实现快速光栅化。理论上,透视分割会导致这些顶点中的每一个都被剪裁。当然,如果你想用W来做一些有意义的事情,那你就太倒霉了:)不幸的是,这并不能解决OpenGL ES的难题,因为ES和ES 2.0没有转换反馈。@DylanHolmes:非常感谢你。你是说我也可以关闭像素着色器?有没有办法从转换反馈中读取数据?是否有任何教程或示例程序之类的东西可以帮助我开始学习?我是OpenGL的初学者。您可以通过将每个顶点的w坐标设置为0来“关闭”像素着色器,如上面@AndonM.Coleman所说。一个很好的入门教程是我自己也很喜欢这种方法,因为它允许在真正意想不到的环境中使用很多GPGPU(即WebGL)。如果你能将你的算法构造成在不支持浮点渲染目标的实现中很好地工作,你会惊讶于有多少设备能够使用GPGPU。由于转换反馈在OpenGL ES 2.0中不可能实现,因此我认为可移植解决此问题的唯一方法是使用顶点着色器阶段作为简单的传递,如您所说,并在片段着色器中进行工作。使用片段状态进行计算有一个缺点:它不允许执行分散写入,这对于某些算法来说可能是个问题。根据实际需要,可以使用顶点着色器阶段执行“散射”计算,发出单像素点的位置,并让片段着色器执行本地化计算。@darius:仍然可以为选定的变量启用插值。@DatenWalf使用顶点着色器进行散射写入是一个非常好的解决方案。这对我真的很有用。谢谢。@darius非常感谢你。是否有任何教程或示例程序之类的东西可以帮助我开始学习?我是OpenGL的初学者。