3

网络上没有太多关于它们的深入信息。

它们是如何实施的以及它们如何在幕后工作?我想知道它们是否会导致任何性能开销,尤其是在使用多个子例程来决定创建不同版本的着色器的最佳实践的情况下:子例程或单独的着色器。

有什么信息或建议吗?

4

1 回答 1

4

从这里的 OpenGL 论坛引用了一个很好的详细答案 。

子程序变量与 C 中的函数指针非常相似,或者如果必须,我们可以称它们为“虚拟函数”(正如 D3D 所指的那样)。

它们可能在所有硬件上实现为实际的函数指针,即调用子程序将转换为从寄存器/内存位置获取被调用地址的间接 CALL 指令。因此,您可以期望它们可能比着色器中的 switch case 语句或在多个着色器之间切换更有效。

然而,这就是它应该如何工作的,因为某些硬件或驱动程序可能存在效率低下,使它们比它们可能的速度慢,但这是另一回事。此外,不幸的是,由于 API 本身,子例程具有固有的低效率,即每次绑定具有子例程变量的程序时,您都必须重新指定子例程变量和子例程之间的关联(使用 glUniformSubroutinesuiv)。这是 D3D 的不幸继承,因为 GL 从那里复制了这种奇怪的行为。

于 2013-07-17T20:26:14.997 回答