2011-10-31 66 views
4

在GLSL着色器中,由於各種原因(例如使用四個函數應用光照,紋理,speculars和霧等)的片段着色器,我經常需要一些函數來修改單個值。我可以想到至少有三種方法可以將這些值傳遞給修改:在GLSL中傳遞值的最快方式是什麼?

  1. 使用inout參數爲每個功能。
  2. 將該值作爲in參數傳遞,並使用返回值(顯然缺點是我只能使用一個值)。
  3. 使用每個函數修改的全局變量。

我應該期待這些方法之間有什麼實際差異嗎?有些可能比別人更快?比其他更兼容嗎?還有其他的區別嗎?還是其他方法呢?

或者我可以簡單地選擇一個我最喜歡的風格嗎?

+4

優化您的算法。然後優化您發現的任何其他瓶頸。做完所有這些之後,_then_您可以考慮修改參數的哪些方法在給定的編譯器上工作得最好(因爲它將依賴於編譯器)。一般來說,你會精確地擺脫這一點。 –

+1

如果在任何給定的程序階段只有一個着色器,那麼描述的三種方法可能最終都是相同的。如果您將多個着色器鏈接到單個階段,那麼使用全局可能會不同(更好或更糟)。與往常一樣,您需要通過簡介來弄清楚什麼(如果有的話)是不同的以及瓶頸在哪裏。 –

+1

此外,對於#2,您可以使用'out'參數來獲得(有效)額外的返回值。 –

回答

0

這種優化主要依賴於底層的GLSL編譯器。在不同的GPU上分析着色器:AMD,nVidia和Intel,並選擇最佳代碼路徑。

相關問題