似乎这个特性记录很差。在DirectX SDK中的几何着色器教程中,没有使用CreateGeometryShaderWithStreamOutput的示例,并且没有任何线程可以解释它的基础知识。在msdn中它们说明要使用哪些函数创建它,但不是如何以及它用于什么。是否有人成功使用它,你可以分享一个小例子或教程的链接吗?它用于什么,是否良好的性能?目前为止据我所知,它用于基于GPU的视锥体剔除?
答案 0 :(得分:3)
您可以在DirectX SDK中找到2个示例(在directX 10部分中)
您还可以查看NVidia示例: http://developer.download.nvidia.com/SDK/10/direct3d/samples.html
Rain和Metaballs正在使用流出
所有这些样本都在dx10上,但它们很容易移植到dx11(只需要几个位来替换)。
它有很多用法(非详尽列表):
如果您想使用原始管道而不是流输出,则需要执行以下操作(这是Microsoft Stream Output documentation的摘要)
FX Framework在幕后做同样的事情。
必须使用CreateGeometryShaderWithStreamOutput
创建几何着色器您需要设置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 );