2017-09-27 70 views
0

這個問題是特定於WebGL,並假定VAOs不可用。WebGL - 當我調用bindBuffer和vertexAttribPointer?

我試圖通過限制低層次的狀態變化的數量做出了3D引擎的一些小的改進。但事實證明,我是一個有點困惑使用bindBuffervertexAttribPointer的正確方法。

比方說,我要畫兩個對象:

  • 的第一個對象使用兩個緩衝區一個ç與元素緩衝è;
  • 第二對象使用緩衝器Ç用相同的要素緩衝器ë

緩衝器使用相同的佈局,並且兩者都通過引用的位置0,而Ç由位置引用1.

最初,ARRAY_BUFFER_BINDING點到零而ELEMENT_ARRAY_BUFFER_BINDINGE

冗餘檢驗器輸出具有(ÇÈ)=(3,6,5,2)執行以下操作:

WebGL Inspector trace

這意味着即:

  1. bindBuffer(ELEMENT_ARRAY_BUFFER, [Buffer 2])是不必要的
  2. vertexAttribPointer(1, 2, FLOAT, false, 0, 0)可能已經避免

由於WebGL的可直接ELEMENT_ARRAY_BUFFER_BINDING知道索引存儲在何處,1。對我來說很有意義。

但是,2.意味着緩衝器佈局存儲內部的VBO,這是錯誤的,因爲緩衝不會被視爲冗餘上線15和30(幾個幀被渲染的已,所以他們應該保持自己的狀態)

我覺得我很困惑如何drawElements知道使用什麼緩衝何處/何時緩衝佈局存儲

什麼是bindBuffervertexAttribPointer這個例子的情況下,爲什麼最佳使用?

回答

0

其實我想通過簡單地看看redundancy checker的來源找出來。

有2件知道重要的事情:

  • 緩衝區佈局必然每個位置而不是每個VBO。
  • vertexAttribPointer還將當前緩衝區分配到指定的位置

內部,WebGL的保留每個位置6個參數:

VERTEX_ATTRIB_ARRAY_SIZE_X 
VERTEX_ATTRIB_ARRAY_TYPE_X 
VERTEX_ATTRIB_ARRAY_NORMALIZED_X 
VERTEX_ATTRIB_ARRAY_STRIDE_X 
VERTEX_ATTRIB_ARRAY_POINTER_X 
VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_X 

這裏是vertexAttribPointer做:

function vertexAttribPointer(indx, size, type, normalized, stride, offset) { 
    this.stateCache["VERTEX_ATTRIB_ARRAY_SIZE_" + indx] = size; 
    this.stateCache["VERTEX_ATTRIB_ARRAY_TYPE_" + indx] = type; 
    this.stateCache["VERTEX_ATTRIB_ARRAY_NORMALIZED_" + indx] = normalized; 
    this.stateCache["VERTEX_ATTRIB_ARRAY_STRIDE_" + indx] = stride; 
    this.stateCache["VERTEX_ATTRIB_ARRAY_POINTER_" + indx] = offset; 
    this.stateCache["VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_" + indx] = this.stateCache["ARRAY_BUFFER_BINDING"]; 
} 

最後,WebGL Inspector是真的!狀態變化第15行和第30行是必要的,因爲VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_0正在改變。

這裏是最佳的痕跡:

bindBuffer(ARRAY_BUFFER, A) 
vertexAttribPointer(0, 3, FLOAT, false, 0, 0) 
drawElements(TRIANGLES, 768, UNSIGNED_BYTE, 0) 
bindBuffer(ARRAY_BUFFER, B) 
vertexAttribPointer(0, 3, FLOAT, false, 0, 0) 
drawElements(TRIANGLES, 768, UNSIGNED_BYTE, 0) 

bindBuffer(ARRAY_BUFFER, C)不需要了,因爲我們沒有做任何事的。)