2017-08-24 47 views
2

比方說,我有一個非常簡單的GLSL頂點着色器:統一變量的操作是否被緩存在GLSL中?

uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 

in vec3 position; 
in vec3 color; 

out vec3 vertexColor; 

void main() 
{ 
    mat4 mvp = projection * view * model; 
    vertexColor = color; 
    gl_Position = mvp * vec4(position, 1.0); 
} 

是變量mvp重新計算每個頂點,或者是預先計算和存儲,直到它依靠變化的均勻變量?

回答

6

特定的實現可以緩存那個值嗎?當然。他們會嗎?

我不會認爲他們會。這種緩存很難實現,因爲它需要在繪製調用之前根據統一狀態評估這些表達式,然後將這些表達式上傳到代碼中。

如果您有一些狀態是從多個統一值計算出來的,並且您認爲這樣的計算會是性能問題,那麼您應該計算它。

+0

爲什麼難以實施?你只需要在編譯過程中爲變量創建一個依賴關係樹,然後更新所有依賴於任何變化的統一變量的變量。 –

+0

@ Bobby-Z:你說「只是」,就好像那是微不足道的。它還要求你實現一個任意的表達式計算器,它可以根據輸入的統一的當前值計算該「依賴關係樹」的值。還有一個事實是,制服佔用着色資源,這是有限的。你會有效地創建第四個「mat4」統一值。如果製造出來的制服之一是什麼推動你超過舞臺上統一的限制,會發生什麼? –

+0

計算依賴關係樹是微不足道的。在編譯過程中,你會發現'mat4'的初始化表達式中引用的所有變量,找出所有這些變量是否均勻,或者如果不是,則遞歸檢查這些變量是否僅依賴於統一變量。大多數現代編譯器都用變量來做類似的事情。 –

相關問題