gpt4 book ai didi

hlsl - 如何将几何着色器与输出流一起使用?

转载 作者:行者123 更新时间:2023-12-04 05:31:14 25 4
gpt4 key购买 nike

似乎此功能的文档记录很差。在 DirectX SDK 中的几何着色器教程中,没有使用 CreateGeometryShaderWithStreamOutput 的示例,也没有任何线程可以解释它的基础知识。在 msdn 中,他们说使用什么函数来创建它,但不是它的用途和用途。有没有人成功使用过它,你能分享一个小例子或教程的链接吗?它的用途是什么,性能好吗?据我所知,它用于基于 GPU 的截锥体剔除?

最佳答案

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

  • 管道GS
  • 颗粒GS

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

    Rain 和 Metaballs 正在使用流输出

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

    它有很多用途(非详尽列表):
  • 动态粒子
  • 模型预处理(蒙皮、置换、镶嵌)。因此,您可以在模型上应用一次置换,然后将置换后的模型重新绑定(bind)到多个 channel (阴影贴图/ Material ...)
  • 模型导出:在着色器中生成一些几何图形,在 cpu 中获取流输出内容并导出为 3d 模型。

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

    FX 框架在后台执行相同的操作。

    您的几何着色器必须使用 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(允许使用着色器 View 和原始 View )。

    最后,在执行绘图之前,为您的流输出缓冲区分配 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 );

    关于hlsl - 如何将几何着色器与输出流一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606556/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com