Opengl GLSL 4.x子例程变量是否会导致任何性能开销?

Opengl GLSL 4.x子例程变量是否会导致任何性能开销?,opengl,3d,glsl,gpu,Opengl,3d,Glsl,Gpu,网络上没有太多关于他们的深入信息 它们是如何实施的,以及它们在幕后是如何工作的? 我想知道它们是否会导致任何性能开销,特别是在多个子例程的情况下,决定创建不同版本的着色器的最佳实践是:子例程还是单独的着色器 有什么信息或建议吗?一个来自OpenGL论坛的详细答案 子程序变量很像C中的函数指针,或者 如果有必要,我们可以称之为“虚拟函数”(如D3D所指) 他们) 它们可能作为实际功能在所有硬件上实现 指针,即调用子例程将转换为间接调用 从寄存器/内存中获取被调用地址的指令 地点。因此,您可以期望

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

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


有什么信息或建议吗?

一个来自OpenGL论坛的详细答案

子程序变量很像C中的函数指针,或者 如果有必要,我们可以称之为“虚拟函数”(如D3D所指) 他们)

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

然而,这只是它应该如何工作,因为可能会有 某些硬件或驱动程序效率低下,使它们比 他们可能是,但那是另一回事。不幸的是, 由于API本身的原因,子例程具有固有的低效性, 也就是说,您必须重新指定子例程之间的关联 变量和子例程(使用glUniformSubroutinesuiv)每个 绑定具有子例程变量的程序的时间。这是一个 来自D3D的不幸继承,因为GL复制了这种奇怪的行为 从那里开始


你说的是一般函数还是GL4.x“子程序”功能?GLSL 4.x子程序功能。我知道函数通常是内联的。我的发现: