多通道着色器和通道之间的切换

正如这里所提到的,在DX11中应该避免使用效果。 如果我理解正确,包括在* .FX文件中定义的技巧和通行证。 所以当做一个多通道着色器(就像总是提到的着色器)我应该创建2个独立的着色器(2遍),设置第一个,渲染几何,设置第二个,再次渲染几何。 正确的到目前为止?

但是我关心的是,这个技巧/传入效果是否仅仅是一个语法糖,并且不提供任何性能改进。 或者一般的整个效果。 他们呢?

GLSL版本4.20或者那个有子程序,允许在着色器中切换function,避免改变着色器,这会提高性能 。 DX有类似的东西吗?

编辑:这里[ 链接 ]它说:

由于性能在着色器程序中至关重要,避免使用条件语句或着色器交换可能是非常有价值的。 使用子例程,我们可以实现条件语句或着色器交换的function,而不需要计算开销。

另外这个post似乎证实了这一点。

效果文件中的技巧和传递只是语法糖。 在内部,效果系统为每种技术的每次通过创建一个单独的着色器。 它也可以为你管理常量缓冲区。 效果11源现在在那里,所以你可以看看那里,看看它是如何工作的。

至于切换着色器,通常的看法是,通过着色器对绘图进行sorting是一种很好的做法,以尽可能减less状态变化。 尽管如此,我还没有看到近期有多lessperformance受到威胁的研究。

我不太熟悉GLSL子程序,但是它们听起来和D3D11 dynamic链接相似(我很确定基本上没有人使用)。 在内部,如果graphics驱动程序仅仅为每个GLSL子例程或每个D3D11类接口编译一个单独的着色器版本,我不会感到惊讶,所以我不会认为这些实际上降低了状态成本交换。