HLSL模型5几何着色器中的实例与循环

时间:2016-02-24 05:24:39

标签: directx shader hlsl

我正在寻找为DirectX11编写的程序,以便在DirectX10上发挥出色。要做到这一点,我需要为模型4而不是5编译着色器。现在唯一的问题是几何着色器使用{4}不支持的instancing。一般模型是

[instance(NUM_INSTANCES)]

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

我似乎无法找到许多关于其存在原因的文档,因为我的想法是:我只能用从instanceId = 0到instanceId = NUM​​_INSTANCES-1的循环替换它吗?

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

1 个答案:

答案 0 :(得分:-1)

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

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

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