【问题标题】:Instance vs Loops in HLSL Model 5 Geometry ShadersHLSL 模型 5 几何着色器中的实例与循环
【发布时间】:2016-02-24 05:24:39
【问题描述】:

我正在寻找为 DirectX11 编写的程序,以便在 DirectX10 上运行良好。为此,我需要为模型 4 而不是 5 编译着色器。现在唯一的问题是几何着色器使用 instancing,这是 4 不支持的。一般模型是

[instance(NUM_INSTANCES)]

void Gs(..., in uint instanceId : SV_GSInstanceID) { }

我似乎找不到很多关于为什么会存在的文档,因为我的想法是:我不能用从 instanceId=0 到 instanceId=NUM_INSTANCES-1 的循环替换它吗?

答案似乎是否定的,因为它似乎没有正确输出,但除了我的确切问题之外 - 你能帮我理解为什么存在实例化的概念吗?除了简单地使用不同的索引调用主函数两次之外,实例化对整个管道是否有一些影响?

【问题讨论】:

    标签: directx shader hlsl


    【解决方案1】:

    关于为什么我的替换不起作用: 几何着色器用 [maxvertexcount(N)] 注释。我错误地认为这是顶点输入计数,并忽略了它。事实上,输入是由输入的基元类型决定的,所以这是关于输出的。以前,如果 N 是我在 I 个实例上的输出,则每个实例输出 N 个顶点。但是现在我想使用循环,单个实例输出 N*I 个顶点。因此,答案是按照我的建议去做,同时使用 [maxvertexcount(N*NUM_INSTANCES)]。

    为了更广泛地回答我的问题,为什么实例在已经有循环的世界中可能有用,我只能猜测

    • 事实证明,着色器并不真正支持循环 - 显卡内核没有控制流的概念。在着色器中编写循环时,循环将展开(参见 [unroll])。这有一些限制,会使编译速度变慢,并使着色器 blob 变大。
    • 实例可以并行化 - 一个 GPU 核心可以运行一个着色器实例,而另一个 GPU 核心可以使用相同的输入运行同一着色器的下一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多