GLSL 4.x子程序变量会导致任何性能开销吗?

时间:2013-07-17 17:16:01

标签: opengl 3d glsl gpu

网上没有太多关于他们的深层信息。

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

任何信息或建议?

1 个答案:

答案 0 :(得分:4)

来自OpenGL论坛的一个很好的详细解答 here

  

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

     

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

     

但是,这就是它应该如何工作的原因   一些硬件或驱动程序的低效率使它们慢于   他们可以,但这是另一个故事。不幸的是,   由于API本身,子程序具有固有的低效率,   即你必须重新指定子程序之间的关联   每个变量和子程序(使用glUniformSubroutinesuiv)   绑定具有子例程变量的程序的时间。这是个   不幸的继承自D3D,因为GL复制了这种奇怪的行为   从那里。