OpenGL 在现代硬件上分离着色器程序和管道性能

OpenGL Separable shader programs and pipline performance on modern hardware

我正在将一个小型 OpenGL 框架从 3.3 移植到 4.3。我在软件中实现了着色器 mix/match(即:着色器是单独绑定的,程序在发出绘制调用时延迟链接。)。

OpenGL 4.1 通过可分离的程序和管道添加了此功能,但是让程序封装所有着色器阶段的目的是能够将它们作为一个整体进行优化(并且只优化一次)。

所以我想知道在 Direct3D 11 硬件上使用 SPO 是否比标准着色器程序慢。特别是:当前的实现是否允许每个着色器有一个程序(因此具有 2-5 个独立程序的管道)而不会显着降低性能?

有趣的是你竟然提到了 D3D11 硬件的名字。

如果您谈论 D3D,您应该知道它一直以这种方式工作。着色器程序不是不可变的对象,每个阶段在 D3D 中都链接在一起,就像在 OpenGL 中一样。 D3D 使用语义和其他优点让您可以随时更换附加到每个阶段的着色器。硬件一直以 D3D 的方式工作,而 OpenGL 现在更好地展示了这一点。

您是否会看到可分离着色器的性能变化不是硬件问题。任何性能增益或损失都取决于驱动程序的实现。然而,它不可能是实质性的,否则 D3D 很久以前就会采用 OpenGL 的链接程序模型——API 不断重塑自身以降低开销。