2016-01-03 44 views
0

我試圖創建一個übershader表示這可能會有些波陣面數據或可能不包含一些屬性,如:GLSL着色器可選屬性

  1. 一個或多個對象可能包含uv座標和紋理
  2. 一個或多個對象可能包含正常映射爲每個頂點
  3. 一種或多種材料可能具有不同的照明類型來呈現,並且包含用於凹凸映射紋理

等。

現在,它可能或可能不是一個好主意,爲此創建一個ubershader(我正在嘗試),但我面臨的問題是一些屬性被指定,一些不是(缺少制服,如紋理未設置採樣器的布爾值統一可以打開和關閉採樣功能)。

是什麼在GLSL v 3.00發生時的屬性是未分配(這意味着沒有glEnableVertexAttribArray,例如,還沒有綁定任何/任何緩衝液)在GLSL程序不用於閱讀(例如,我將使用一個統一的boolean把紋理查找關閉,當UV座標缺失,但我仍然會插的座標爲頂點和片段着色器之間的輸入/輸出,像這樣:

// Vertex shader 
in vec3 vn; 
out vec3 fvn; 

[...] 

fvn = vn; 

...)?

這是glsl的合法使用,還是會產生奇怪的兼容性問題(我正在開發移動設備,正如OpenGL ES3.0標記所暗示的)?

我正在尋找第一手經驗或權威來源,

謝謝!

+1

你是什麼意思「既沒有指定也沒有使用」?具體由「未指定」? –

+0

@NicolBolas謝謝你的評論(我的解釋不清楚)!我會立即糾正這個問題,儘管我認爲Reto的答案能夠解決我的問題。 – Rick77

回答

3

屬性始終指定。您可以選擇是從數組中提取數據,還是使用當前值。

從數組中使用的數據,你叫:

glEnableVertexAttribArray(loc); 

當啓用該屬性陣列,該屬性是從被綁定爲GL_ARRAY_BUFFER最後glVertexAttribPointer()調用時緩衝區中取出。

要使用當前屬性值,你可以調用:

glDisableVertexAttribArray(loc); 

雖然屬性陣列被禁用,使用該屬性的值由上次調用glVertexAttrib4f()或其它功能從同一glVertexAttrib*()給出家庭,如果您從未調用任何這些功能,則默認值爲(0.0,0.0,0.0,1.0)。

因此,具有「未指定」屬性不是一個問題,因爲它從來沒有真正沒有指定。唯一需要注意的是,如果沒有指定一個有效數組glVertexAttribPointer(),則不啓用屬性數組。最安全的方法是,您可以撥打glDisableVertexAttribArray()來獲取您未使用的屬性。

+0

非常感謝您提供非常清楚和詳盡的解釋:這正是我一直在尋找的! 「glVertexAttrib *」的「後備」尤其是我正在尋找的東西,這是一件很好的事情。 – Rick77