2017-03-22 33 views
0

我有一個運行於每個頂點6個字節的一些打包的頂點數據:GLES2.0 glVertexAttribPointer:使用奇數Stride和Offset值的性能損失?

glVertexAttribPointer Shader.pos3d_loc, 3, GL_UNSIGNED_BYTE, True, 6, 0 
glVertexAttribPointer Shader.norm_loc, 3, GL_UNSIGNED_BYTE, True, 6, 3 

是否有通過使用不的4個字節的倍數的進步和偏移引起的任何性能損失(如隱藏的內存拷貝)?

+0

此時不做任何複製。您可以將數據複製到頂點緩衝區,或者根據需要逐個訪問這些值。這些值只是告訴openGL如何解釋你的緩衝區。例如normal [i] .x =(float)((ubyte)(((void *)ptr)[stride * i]))其中ubyte來自GL_UNSIGNED_BYTE參數。 –

+0

謝謝:)我明白這個函數的功能,但我知道有幾個對齊和格式相關的陷阱,GL會以很大的性能代價在內部無聲地轉換數據。我想知道是否指定奇數步長和對齊會導致GL在最終呈現調用發生時在內部重新緩衝數據。 – Peeling

回答

0

簡短的回答是「這取決於」:

在PC和(至少部分)的Android設備,有一個以這種方式緊密包裝3組件的屬性沒有明顯的點球。

關於IOS(反正寫這篇文章),會有很大的性能損失。 IOS GL實現內部解包並對齊任何不是4字節對齊的屬性,導致內存和CPU命中。除非您使用動態VBO,否則CPU命中可能不明顯。