我正在从3.3到4.3移植一个小的OpenGL框架。我在软件中实现着色器混合/匹配(即:单独绑定着色器,并且在发出绘制调用时,程序会延迟链接。)。
OpenGL 4.1通过可分离的程序添加了此功能。然而,让程序封装所有着色器阶段的要点是能够将它们作为一个整体进行优化(并且只能进行一次)。
所以我想知道在Direct3D 11硬件上使用SPO是否比标准着色器程序慢。特别是:当前的实现是否允许每个着色器有一个程序(所以一个包含2-5个独立程序的管道)没有明显的性能损失?
答案 0 :(得分:2)
有趣的是你应该提到名称的D3D11硬件。
如果你谈论D3D,你应该知道它一直都是这样的。着色器程序不是不可变对象,每个阶段在D3D中链接在一起就像它们在OpenGL中一样。 D3D使用语义和其他好东西让你随时换掉连接到每个舞台的着色器。硬件一直以D3D的方式工作,OpenGL现在更好地公开了它。
无论您是否会看到可分离着色器的性能变化都不是硬件问题。任何性能增益或损失都将取决于驱动程序的实现。然而,它不可能是实质性的,或者很久以前D3D会采用OpenGL的链接程序模型 - 该API不断重新发明自己以降低开销。