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

Posted

技术标签:

【中文标题】现代硬件上的 OpenGL 可分离着色器程序和管道性能【英文标题】:OpenGL Separable shader programs and pipline performance on modern hardware 【发布时间】:2015-09-27 15:58:34 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

有趣的是,您应该提到 D3D11 硬件的名称。

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

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

【讨论】:

非常感谢!我自己从未使用过 D3D,我不知道它有可分离的阶段。

以上是关于现代硬件上的 OpenGL 可分离着色器程序和管道性能的主要内容,如果未能解决你的问题,请参考以下文章

现代opengl渲染管道

OpenGL:旧 ATI 卡上的“硬件不支持片段着色器”

带有着色器程序且没有错误的现代 OpenGL 黑屏

在opengl中绘制几何图形

OpenGL学习整理------着色器

OpenGL着色器没有将变量从顶点传递到片段着色器