2013-04-25 73 views
2

哪個更快,單個調用glUseProgram,或發送6個左右通過glUniform浮動(分批或分開),並大約多少錢?OpenGL ES 2.0:glUseProgram vs glUniform performance

+1

[GLSL multiple shaderprogram VS uniforms switches]可能的重複(http://stackoverflow.com/questions/6539774/glsl-multiple-shaderprogram-vs-uniforms-switches) – Ani 2013-04-25 17:54:16

+0

這裏沒有提到這個問題。雖然它涉及同一主題,但另一個問題是:「初始制服設置是否抵消了glUseProgram調用開銷」。這個問題特別要求在'glUseProgram'調用和'glUniform'調用之間進行直接的頭對頭速度比較,其他問題沒有要求,在這種情況下,具體地(a)「glUniform」調用/與6個花車呼叫。 – Navigateur 2013-04-25 21:20:15

+0

我不同意。儘管問題略有不同,但我相信您收到的答案將沿着相同的路線。 「重複」標籤是指導你一套已經提供的答案 - 而不是反思你的問題的質量。如果有「答案將與」標籤相同,我很樂意使用它。 – Ani 2013-04-29 15:03:21

回答

0

你能更詳細地描述一下你認爲這會影響渲染管道性能的場景嗎?他們提供完全不同的功能,我不明白你爲什麼會關心glUseProgram vs glUniform的性能。

現在讓我們來分析一下當你使用這個函數來了解他們的成本時會發生什麼。

當您調用glUseProgram時,它會更改幾個OpenGL渲染狀態,因爲我們要使用附加到程序對象的新着色器。該規範說明當您調用此函數時,頂點和片段程序將安裝在處理器中。這似乎足以掩蓋glUniform的成本。此外,當您安裝新的頂點和片段程序時,渲染管線的其他狀態會更改以適應程序使用的紋理單元和數據佈局的數量。

glUniform將數據從一個內存位置複製到另一個位置以指定統一變量的值。最糟糕的情況是複製似乎不如glUseProgram複雜的矩陣。

但最終,這一切都取決於您使用glUniform傳輸的數據量以及glUseProgram的底層實現(它可以由驅動程序進行超級優化,成本非常低),並且如果您的引擎非常智能足以將使用相同程序的幾何進行分組,並在不改變狀態的情況下繪製它。

+0

感謝您的想法 - 我希望有更多的數字可用於此。我可以使用'glUseProgram'在着色器或簡單的'glUniform'之間切換到相同的着色器,以獲得完全相同的效果。無論哪種情況,着色器都會執行完全相同的計算工作,因此我要求進行直接頭對頭速度比較。 'glUseProgram'開關是一個已經鏈接的程序,'glUniform'是在典型的Android設備上發送6個浮點數(單獨或批量爲一個數組)到當前使用的程序。似乎無法找到足夠的信息來確定哪個會更快 – Navigateur 2013-04-30 02:17:12

+1

如果您在着色器代碼中分支以處理不同的渲染路徑,懲罰可能會高於切換程序。 – 2013-05-03 02:00:26

+0

好點,但在我的情況下沒有分支 - 只是'glUniform'向單個計算髮送一些浮點數(vs'glUseProgram'來切換每個程序都有那些硬編碼的非常相同的浮點數的程序)。顯然,這隻適用於在應用程序的整個生命週期內保持固定的值(但在每個「draw」調用之前不同)。無論如何,我必須通過'glUniform'發送其他的着色器計算中的動態值。 – Navigateur 2013-05-03 09:13:58