Directx HLSL模型5几何体着色器中的实例vs循环

Directx HLSL模型5几何体着色器中的实例vs循环,directx,shader,hlsl,Directx,Shader,Hlsl,我正在考虑为DirectX11编写一个程序,以便在DirectX10上运行良好。为此,我需要为模型4而不是5编译着色器。现在唯一的问题是几何体着色器使用的是4不支持的。一般模型是 [instance(NUM_INSTANCES)] void Gs(..., in uint instanceId : SV_GSInstanceID) { } 我似乎找不到很多关于为什么会出现这种情况的文档,因为我的想法是:我不能用instanceId=0到instanceId=NUM\u INSTANCES-1

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

[instance(NUM_INSTANCES)]

void Gs(..., in uint instanceId : SV_GSInstanceID) { }
我似乎找不到很多关于为什么会出现这种情况的文档,因为我的想法是:我不能用instanceId=0到instanceId=NUM\u INSTANCES-1的循环来替换它吗?


答案似乎是否定的,因为它的输出似乎不正确,但除了我的确切问题之外——你能帮助我理解为什么存在实例化的概念吗。对于整个管道来说,实例化是否意味着除了用不同的索引调用两次主函数之外,它还有什么意义?

关于我的替换没有起作用的原因: 几何体着色器使用[maxvertexcount(N)]进行注释。我错误地假设这是顶点输入计数,并忽略了它。事实上,输入是由输入的原语类型决定的,所以这是关于输出的。以前,如果N是我对I个实例的输出,则每个实例输出N个顶点。但是现在我想使用一个循环,一个实例输出N*I个顶点。因此,答案是按照我的建议执行,并使用[maxvertexcount(N*NUM_实例)]

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

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