如何将Geometry Shader与输出流一起使用?

时间:2012-09-26 16:45:50

标签: hlsl directx-11 geometry-shader

似乎这个特性记录很差。在DirectX SDK中的几何着色器教程中,没有使用CreateGeometryShaderWithStreamOutput的示例,并且没有任何线程可以解释它的基础知识。在msdn中它们说明要使用哪些函数创建它,但不是如何以及它用于什么。是否有人成功使用它,你可以分享一个小例子或教程的链接吗?它用于什么,是否良好的性能?目前为止据我所知,它用于基于GPU的视锥体剔除?

1 个答案:

答案 0 :(得分:3)

您可以在DirectX SDK中找到2个示例(在directX 10部分中)

  • PipesGS
  • ParticlesGS

您还可以查看NVidia示例: http://developer.download.nvidia.com/SDK/10/direct3d/samples.html

Rain和Metaballs正在使用流出

所有这些样本都在dx10上,但它们很容易移植到dx11(只需要几个位来替换)。

它有很多用法(非详尽列表):

  • 动态粒子
  • 模型预处理(蒙皮,位移,细分)。因此,您可以在模型上应用一次置换,然后将移位的模型重新绑定到多个通道(阴影贴图/材质......)
  • 模型导出:在着色器中生成一些几何体,在cpu中获取流输出内容并导出为3d模型。

如果您想使用原始管道而不是流输出,则需要执行以下操作(这是Microsoft Stream Output documentation的摘要)

FX Framework在幕后做同样的事情。

必须使用CreateGeometryShaderWithStreamOutput

创建几何着色器

而不是CreateGeometryShader

您需要设置D3D11_SO_DECLARATION_ENTRY以匹配几何着色器输出布局(这与输入汇编程序的工作方式相同)

接下来确保使用流输出访问创建缓冲区:

D3D11_BUFFER_DESC bufferDesc;
bufferDesc.BindFlags = otherBindFlags | D3D11_BIND_STREAM_OUTPUT;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.CPUAccessFlags = 0;

请注意,otherBindFlags不能同时为D3D11_BIND_UNORDERED_ACCESS(允许使用着色器视图和原始视图)。

最后,在执行绘制之前,请使用SOSetTargets

分配流输出缓冲区
UINT offset[1] = 0;
ID3D11Buffer* m_pBuffer (your buffer created before)
deviceContext->SOSetTargets( 1, &m_pBuffer, offset );

完成抽奖通话后,请不要忘记使用以下方式清理:

UINT offset[1] = 0;
ID3D11Buffer* pNullBuffer = 0;
deviceContext->SOSetTargets( 1, &pNullBuffer, offset );