2013-07-17 31 views
3

網絡上沒有太多關於他們的深層信息。GLSL 4.x子例程變量是否會導致任何性能開銷?

它們是如何實現的以及它們如何在引擎蓋下工作? 我想知道它們會導致任何性能開銷,尤其是在多個子例程的情況下,您可以決定創建不同版本着色器的最佳做法:子例程或獨立着色器。

任何信息或建議?

+1

你是在談論一般函數還是GL 4.x的「子程序」功能? –

+0

GLSL 4.x子例程功能。我知道這些功能通常是內聯的。 – plasmacel

回答

4

不錯,來自OpenGL論壇 here發起問題。

子程序變量非常像函數指針在C,或 如果我們有,我們可以稱之爲「虛擬功能」(如D3D指 它們)。

他們所有的硬件可能實現爲實際功能 指針,即調用子程序將轉化爲間接CALL 指令從寄存器/存儲器 位置採取所謂的地址。因此,您可以預期它們可能比着色器中的 開關情況語句更有效,或者在多個 着色器之間切換。

然而,這一切應該是如何工作的,因爲有可能是在某些硬件或驅動程序,使它們比 較慢,他們可能是 效率低下,但這是另一個故事。另外,不幸的是, 子例程由於API本身而具有固有的低效率,即您必須重新指定子程序 變量和子程序(使用glUniformSubroutinesuiv)之間的關聯,因爲每個單獨的 時間綁定具有子例程變量的程序。這是來自D3D的不幸繼承,因爲GL從那裏複製了這個奇怪的行爲 。

+2

我的發現:http://www.gamedev.net/topic/652739-have-you-used-gl-arb-shader-subroutine-or-dx-dynamic-shader-linking/ – RelativeGames

相關問題