回答
因爲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_BUFFER
和ELEMENT_ARRAY_BUFFER
。要做到這一點,需要兩種緩衝區來保存數據的副本。
注意:WebGL實現緩存與ELEMENT_ARRAY_BUFFER
中的印度相關的信息。這意味着您首次使用緩衝區繪製給定範圍時,WebGL將掃描數據副本以確保沒有索引超出範圍。下一次使用相同的範圍繪製相同的緩衝區時,如果您沒有更改緩衝區中的任何數據,則WebGL已經知道最高索引並且不必再次掃描緩衝區。
- 1. 爲什麼變量不允許綁定
- 2. 爲什麼我的緩衝區佔用比允許的更多的字節?
- 3. 爲什麼綁定OpenGL緩衝區對象?
- 4. 爲什麼需要連續多次綁定一個緩衝區?
- 5. Fifo緩衝區,它允許空元素
- 6. 什麼是緩衝區?什麼是緩衝讀取和寫入?
- 7. 爲什麼不能將不同的服務器綁定到相同的端口?
- 8. emacs緩衝區綁定到密鑰
- 9. RGB緩衝區到JPEG緩衝區,這裏有什麼問題?
- 10. 爲什麼允許CountableRange具有相同的lowerBound和upperBound?
- 11. 如何將兩個不同的頂點緩衝區綁定到兩個插槽
- 12. 使用子緩衝區繪製緩衝區webgl
- 13. Ninject綁定:綁定到不同類型的相同界面。爲什麼有效?
- 14. WebGL:同時使用紋理和顏色緩衝區
- 15. WebGL的幀緩衝區是空白
- 16. WebGL中的索引緩衝區?
- 17. WEBGL從緩衝
- 18. 綁定模板渲染緩衝區幀緩衝區在OpenGL
- 19. 爲什麼在「使用」綁定中不允許模式?
- 20. 爲什麼我的系統不釋放緩衝區/緩存
- 21. %爲什麼不允許
- 22. 什麼是緩衝區?
- 23. protobuf(協議緩衝區)是否允許自定義類型?
- 24. 爲什麼HttpClient.PostAsync緩衝區響應?
- 25. JOCL:爲什麼使用緩衝區?
- 26. 爲什麼FileWriter有一個緩衝區?
- 27. 爲什麼我得到緩衝區不是函數錯誤
- 28. 的JTable綁定不允許
- 29. 如何讓emacs允許在不同的框架中打開一個緩衝區?
- 30. iOS OpenGL ES:何時應該綁定幀緩衝區和渲染緩衝區?
那麼無論如何要使用變換反饋來生成元素數組緩衝區? – jz87
不是直接。您必須調用'gl.getBufferSubData'來提取數據,然後使用'gl.bufferData'或'gl.bufferSubData'將數據上傳到另一個緩衝區。我很想知道爲什麼要在着色器中生成索引緩衝區。一些很酷的技術? – gman
不,這只是我需要生成一些非常大的地形網格,所以在GPU上執行它會更快。我想我可以在webworker中生成索引數組。我正在探索使用更多實例與使用更大瓦片之間的替代方案。 – jz87