2012-12-20 24 views
5

頂點着色器中,當然允許有限數量的統一存儲,並且我的理解是不同的系統可能以稍微不同的方式在編譯代碼方面實現GLSL。我聽說過使用常量而不是在頂點着色器代碼中寫出文字的建議。在頂點着色器中聲明常量而不是文字。標準做法,還是不必要的嚴格?

例如,下面的代碼據推測導致可用統一存儲的減少。 (我不太瞭解。)

例1:用文字

vec4 myVector = vec4(1.0, 0.0, 0.0, 1.0); 

據我瞭解,有可能的1.00.0每次使用佔據了統一的一定量的可能性儲存空間。因此,該建議是把以前的代碼轉換成類似以下內容:

例2:使用常數代替文字

const float zero = 0.0; 
const float one = 1.0; 

vec4 myVector = vec4(one, zero, zero, one); 

有誰知道背後發生了什麼事情的說法?我沒有任何代碼問題,我只是想正確理解這些東西,以便將來沒有問題。

我的正式的問題如下:專門爲使用的OpenGL ES 2.0的iOS平臺,是寫出來與文本(實施例1),或與常量(實施例2的東西最好的做法)。我是否應該花時間每次都用常量寫出東西,或者如果頂點着色器無法正確編譯,我應該寫出文字並只使用常量?

謝謝!

+0

你可以看看二進制文件,看看有什麼區別嗎? –

回答

1

OpenGL® ES 2.0 Programming Guide

至於文字值而言,所述OpenGL ES 2.0的陰影 語言規範規定,任何恆定傳播假設。這個 意味着相同字面值的多個實例將被計數多次。應該聲明適當的 const變量,而不是使用文字值。這避免了相同 字面值算多次,這可能會導致頂點着色器 無法編譯,如果頂點統一存儲需求 超過怎樣實現支持。

我在實際規格中找不到與此相關的任何內容。也沒有特定於iOS的信息。

您也可以檢查GLSL Optimizer工具寫來解決這個問題(和許多其他人)。

+0

感謝Kimi,當我提出這個問題時,我正在閱讀這些內容。我可能會做的只是輸入一串文字,看看它是否在某個時候編譯失敗,然後將它們與常量交換,看看它是否發生了變化。我在閱讀「編程指南」時認爲,作者可能會試圖提出適用於所有平臺的建議,所以我基本上想知道頂點着色器編譯器的iOS實現是否關注這個問題。這不是一個超緊急的問題,但如果我找到答案,我會發布它。 – Mike

3

關於關於規範沒有找到任何雷克南提到,附錄A-7 The OpenGL® ES Shading Language規範的不包括以下內容:

在計算統一變量的使用存在於着色器的任何文字 常量的數量,在計算存儲要求時,預處理後的源包括 。具有相同常量的多個實例 應計數多次。

這可能是Kimi引用的OpenGL® ES 2.0 Programming Guide中的推薦來源。

但是,規範並沒有強制規定這個限制,據推測任何實現都可以自由改進,但我無法找到關於iOS GL驅動程序的任何方法。

我很好奇,有沒有人真的跟上超載文字樣本着色器的想法,試圖達到任何潛在的最大統一限制?

(對不起,我本來打算髮表這個答案作爲對Kimi答案的評論,但是還沒有得到所需的50點評分)。

相關問題