2013-12-22 38 views
4

我現在開始學習着色器(HLSL,GLSL),我看到很多教程,其中沒有創建多個變量,這使得閱讀變得更加困難。我想知道是否創建新變量會影響着色器的性能。在編寫着色器時,我應該避免創建多個變量嗎?

因此,例如(在CG):

比這更快的這個

inline float alphaForPos(float4 pos, float4 nearVertex){ 
      return (1.0/_FogMaxRadius)*clamp(_FogRadius - max(length(pos.z - nearVertex.z),length(pos.x - nearVertex.x)), 0.0, _FogRadius)/_FogRadius; 
    } 

inline float alphaForPos(float4 pos, float4 nearVertex){ 
     float distX = length(pos.x - nearVertex.x); 
     float distZ = length(pos.z - nearVertex.z); 
     float alpha = 0.0; 
     alpha = _FogRadius - max(distZ,distX); 
     alpha = clamp(alpha, 0.0, _FogRadius); 
      return (1.0/_FogMaxRadius)*alpha/_FogRadius; 
    } 
+1

着色器硬件沒有調用堆棧,因此像內聯和變量範圍這樣的概念是完全不同的;但是,如何在函數聲明中設置變量***非常重要。在GLSL中,可以在函數聲明中使用存儲限定符(例如'alphaForPos(在vec4 pos,在vec4 nearVertex中)')告訴編譯器在變量函數體內的值發生變化時創建變量的本地副本。另一方面,'inout'意味着在函數內進行的任何更改都可以在其外部傳播,並且不需要複製。 –

+0

所以有點像在C#中作爲參考傳遞,它不會像在C++中使用const Object&var那樣創建副本,對吧? – Hodor

+0

是的,你可以這樣想。複製變量並不像C++這樣的語言那樣難以預測,它可能會調用一個不平凡的拷貝構造函數,但是您仍然必須處理有限的寄存器空間,浪費的時鐘週期等。 –

回答

5

這不會影響性能。

在一天結束時,所有內容都被內聯,編譯器的優化部分在優化完成時並不關心單獨的變量。

我編譯了兩個簡單的像素着色器,它們調用這兩個函數,並且都編譯成HLSL中的9條指令。

爲了可讀性和信任,編譯器會做正確的事情(至少在此:))。

+0

使得很多意義檢查編譯着色器中的指令數量。在我們相信的編譯器中:) – Hodor

相關問題