网上没有太多关于他们的深层信息。
它们如何实施以及它们如何在引擎盖下工作? 我想知道它们会导致任何性能开销,特别是在多个子例程的情况下,决定创建不同版本的着色器的最佳实践:子例程或单独的着色器。
任何信息或建议?
答案 0 :(得分:4)
来自OpenGL论坛的一个很好的详细解答 here
子程序变量与C中的函数指针非常相似,或者 如果必须,我们可以将它们称为“虚函数”(正如D3D所指的那样) 它们)。
它们可能在所有硬件上实现为实际功能 指针,即调用子程序将转换为间接CALL 从寄存器/存储器中获取被调用地址的指令 地点。因此,您可以期望它们可能比效率更高 在着色器中切换case语句或在多个之间切换 着色器。
但是,这就是它应该如何工作的原因 一些硬件或驱动程序的低效率使它们慢于 他们可以,但这是另一个故事。不幸的是, 由于API本身,子程序具有固有的低效率, 即你必须重新指定子程序之间的关联 每个变量和子程序(使用glUniformSubroutinesuiv) 绑定具有子例程变量的程序的时间。这是个 不幸的继承自D3D,因为GL复制了这种奇怪的行为 从那里。