我想 - 當我搜索,搜索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」。
非常感謝,這很清楚。 這種情況會發生什麼情況:首先着色器渲染一個網格,它啓用了4個屬性。我們不禁用VertexAttributeArrays。接下來,只有2個活動屬性和啓用屬性的着色器會呈現其他幾何圖形。我避免了禁用屬性#2和#3 - GL做什麼? – St0fF
這是一個非常有趣的問題。在功能上,我不相信它會造成任何傷害,即使我無法從一些瀏覽規格中找到這個特別提到的內容。我認爲啓用未使用的屬性可能會損害性能。但是,這將取決於硬件接口和驅動程序的實現。如果有的話,我不會指望它是非常可觀的。直覺上,我仍然建議禁用未使用的頂點屬性。 –