D3D11在几何着色器中写入缓冲区

时间:2014-07-02 22:04:40

标签: opengl windows-7 directx direct3d directx-11

我有一些工作的OpenGL代码,我被要求移植到Direct3D 11。 在我的代码中,我使用着色器存储缓冲区对象(SSBO)在几何着色器中读取和写入数据。

我是Direct3D编程的新手。感谢谷歌,我已经能够识别出相当于SSBO的D3D,RWStructuredBuffer(我认为)。

问题在于我完全不确定我是否可以在D3D11中的几何着色器中使用它们,根据我的理解,它通常最多只能使用4"流出" s这些某种变换反馈缓冲区?)。

问题是:有没有办法让D3D11 / 11.1做我在OpenGL中做的事情(即从几何着色器写入SSBO)?

更新: 刚刚找到此页面:http://msdn.microsoft.com/en-us/library/windows/desktop/hh404562%28v=vs.85%29.aspx

如果我理解正确的部分"在每个流水线阶段使用无人机",似乎在所有着色器阶段都允许访问这些缓冲区。 然后我发现DX11.1仅在Windows 8上可用,但某些功能也移植到Windows 7。 Direct3D的这一部分是否包含在Windows 7上可用的功能中?

3 个答案:

答案 0 :(得分:1)

RWBuffers与几何着色器输出几何体无关,它们主要在计算着色器中找到,在像素着色器中的百分比较少,而且当您发现时,其他阶段需要D3D 11.1和Windows 8。

您正在寻找的是流输出。将缓冲区绑定到几何着色器阶段的输出的API为ID3D11DeviceContext::SOSetTargets,并且需要使用标记D3D11_BIND_STREAM_OUTPUT

创建缓冲区

此外,使用几何着色器输出几何体是D3D10的补充,在D3D11中,通常可以使用计算着色器获得至少同样有效和简单的东西。当然,这不是绝对的建议。

答案 1 :(得分:0)

几何着色器每个组合的基元处理一次,因此可以生成一个或多个基元。

几何着色器的输出可以重定向到输出缓冲区,而不是进一步传递以进行光栅化。

请参阅管道的overview diagram和管道阶段的this description

几何着色器可以访问其他资源,通过设备上下文中的GSSetShaderResources方法进行绑定。然而,这些通常是“固定的”资源。在着色器执行时,例如常量和纹理。对于几何着色器的每次执行而变化的数据是着色器的输入基元。

答案 2 :(得分:0)

刚刚指出这个页面: http://nvidia.custhelp.com/app/answers/detail/a_id/3196/~/fermi-and-kepler-directx-api-support。 简而言之,nvidia不支持卡上的功能<万胜。 这几乎回答了我的问题。 :/