2014-04-22 106 views
1

我想 - 當我搜索,搜索stackoverflow,並沒有找到明確的答案 - 我們需要澄清未來:什麼是glEnableVertexAttribArray的確切範圍?OpenGL ES/2.0:glEnableVertexAttribArray的範圍?

我的意思是什麼?那麼,我們知道:統一狀態綁定到着色器程序。因此,調用glUseProgram(X)(X> 0)也會將所有使用的制服設置爲其默認值(ATI除外),或者在同一程序處於活動狀態時通過glUniformXXX()提供的值。所以我對「glUniform的確切範圍」的問題的回答是「每個特定着色器程序的使用」。

現在我有一個網格可以由多組緩衝區對象的情況。渲染的僞代碼如下所示:

mat = mesh->getMaterial; 
mesh->overrideUniforms; 
mat->prepareGL; // call glUseProgram, update changed Uniforms, bind textures 
mesh->render; 

現在mesh->render顯然與綁定屬性和圖紙交易。的情況下的網具有多組緩衝器,它會看起來像(假設每個緩衝器對象集合包含所有屬性的所有數據/一個渲染過程):

for_each(set_of_bufferObjects) 
    bindBufferObjects 
    for_each(Attribute) 
     glEnableVertexAttribArray 
     glVertexAttribPointer 
    glDraw 

如果enableVertexAttribArray的範圍是F.E. 「每次使用程序X」,只要我之前啓用了陣列(當程序X第一次使用時),我就可以節省那些glEnableVertexAttribArray調用。

如果在另一方面的範圍是「一個特定的程序在使用過程中」,我可以內mesh->render設置它們一次,然後忘記他們。這將特別解釋爲什麼我不會因不禁用任何VAA而遭受副作用。

所以是沒有人在那裏悟到知道哪一塊GL狀態的glEnableVertexAttribArray屬於?

P.S:我明確要求GL/ES 2.0,因爲沒有VAOs通過規範!所以請不要回答「只使用VAO」。

回答

2

這個狀態是全局的。根本不涉及程序狀態。

編輯:我只注意到你的問題的最後一段。因此,對於原始海報,請忽略下面的部分,因爲您不想聽到有關VAO的信息。 ;)我會留在那裏,以防萬一它幫助別人。

完整的OpenGL,以及OpenGL ES的3.0,有一個額外的對象類型,稱爲頂點數組對象(通常縮寫爲VAO)。這允許您將一組給定的頂點緩衝區的所有設置狀態存儲在一個對象中,並通過一個glBindVertexArray調用切換到狀態組。如果您使用此功能,狀態的範圍將成爲VAO。

+0

非常感謝,這很清楚。 這種情況會發生什麼情況:首先着色器渲染一個網格,它啓用了4個屬性。我們不禁用VertexAttributeArrays。接下來,只有2個活動屬性和啓用屬性的着色器會呈現其他幾何圖形。我避免了禁用屬性#2和#3 - GL做什麼? – St0fF

+0

這是一個非常有趣的問題。在功能上,我不相信它會造成任何傷害,即使我無法從一些瀏覽規格中找到這個特別提到的內容。我認爲啓用未使用的屬性可能會損害性能。但是,這將取決於硬件接口和驅動程序的實現。如果有的話,我不會指望它是非常可觀的。直覺上,我仍然建議禁用未使用的頂點屬性。 –