似乎此功能的文档记录很差。在 DirectX SDK 中的几何着色器教程中,没有使用 CreateGeometryShaderWithStreamOutput 的示例,也没有任何线程可以解释它的基础知识。在 msdn 中,他们说使用什么函数来创建它,但不是它的用途和用途。有没有人成功使用过它,你能分享一个小例子或教程的链接吗?它的用途是什么,性能好吗?据我所知,它用于基于 GPU 的截锥体剔除?
问问题
5062 次
1 回答
3
您可以在 DirectX SDK 中找到 2 个示例(在 directX 10 部分)
- 管道GS
- 粒子GS
您还可以查看 NVidia 示例:http: //developer.download.nvidia.com/SDK/10/direct3d/samples.html
Rain 和 Metaballs 正在使用流输出
所有这些样本都在 dx10 上,但它们很容易移植到 dx11(只需更换几位)。
它有很多用途(非详尽列表):
- 动态粒子
- 模型预处理(蒙皮、置换、镶嵌)。因此,您可以在模型上应用一次置换,然后将置换模型重新绑定到多个通道(阴影贴图/材质...)
- 模型导出:在着色器中生成一些几何图形,在 cpu 中获取流输出内容并导出为 3d 模型。
如果您想使用原始管道而不是流输出,则需要执行以下操作(这是 Microsoft Stream Output文档的摘要)
FX 框架在后台执行相同的操作。
您的几何着色器必须使用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 );
于 2012-09-27T10:28:42.607 回答