2017-07-06 58 views

回答

1

因爲WebGL需要安全,因爲它運行在Web瀏覽器中,任何隨機站點或廣告都可以運行WebGL代碼。

爲了安全起見,它必須檢查所有用法不讀取或寫入任何數據越界。一個簡單的輸入示例將調用gl.texImage2D,寬度和高度很大,但緩衝區太小。普通C OpenGL會高興地讀過緩衝區的末尾,但WebGL不會並且會給出錯誤。一個簡單的輸出示例將調用gl.readPixels緩衝區爲給定寬度和高度的小。 OpenGL只會高興地將內存過濾掉。 WebGL將產生一個錯誤。

所以,同樣,當您調用gl.drawElements時,您正在使用索引緩衝區來訪問其他緩衝區中的數據。如果這些指數中的任何一個太大,他們將訪問越界數據。例如,對於具有3個頂點但具有3的索引的屬性,緩衝區是唯一的。唯一在範圍內的索引是0,1和2. OpenGL並不關心這個問題,但WebGL確實如此。

因此,爲了確保您不能這樣做,WebGL必須驗證您的索引。換句話說,它必須通讀您的ELEMENT_ARRAY_BUFFER並檢查沒有索引會引用超出界限的數據。要做到這一點,必須保留ELEMENT_ARRAY_BUFFER中的數據副本(因爲OpenGL ES 2.0無法從緩衝區讀取數據,即使它的速度太慢)。 WebGL的緩衝區中的數據副本使用內存,以便不浪費內存,只有使用ELEMENT_ARRAY_BUFFER製作的緩衝區纔會保留其數據副本。其他緩衝區不需要有其數據的副本。

由於這兩種緩衝區在WebGL中不兼容,因此您無法將其中一個綁定到ARRAY_BUFFERELEMENT_ARRAY_BUFFER。要做到這一點,需要兩種緩衝區來保存數據的副本。

注意:WebGL實現緩存與ELEMENT_ARRAY_BUFFER中的印度相關的信息。這意味着您首次使用緩衝區繪製給定範圍時,WebGL將掃描數據副本以確保沒有索引超出範圍。下一次使用相同的範圍繪製相同的緩衝區時,如果您沒有更改緩衝區中的任何數據,則WebGL已經知道最高索引並且不必再次掃描緩衝區。

+0

那麼無論如何要使用變換反饋來生成元素數組緩衝區? – jz87

+0

不是直接。您必須調用'gl.getBufferSubData'來提取數據,然後使用'gl.bufferData'或'gl.bufferSubData'將數據上傳到另一個緩衝區。我很想知道爲什麼要在着色器中生成索引緩衝區。一些很酷的技術? – gman

+0

不,這只是我需要生成一些非常大的地形網格,所以在GPU上執行它會更快。我想我可以在webworker中生成索引數組。我正在探索使用更多實例與使用更大瓦片之間的替代方案。 – jz87

相關問題