首頁>Game>source

因此,我正在為引擎製作3D批處理渲染器,基本概念是我们製作足够大的VBO和IBO来容纳所有頂點資料(位置,法線,uv等),並使用 glMapBuffer更新VBO 或使用 glbuffersubdata 每幀,如果我们要进行任何更改,但是在這種情况下,IBO(索引緩衝區)的模式是預定義的(即,假設我们有四邊形,並為整个IBO大小填充012230),但是在使用3D模型時, IBO資料不会是不同的情况,那麼如果例項化一个新模型或假設我正在生成UV球並想要更改其细分,该如何更改IBO資料?

我不知道在使用VAO,VBO和索引緩衝區時如何處理動態變化(不需要频繁)的索引資料。

根据OpenGL 4.5核心配置檔案,不支援从客戶端記憶體讀取(§10.3.10OpenGL 4.5核心規範):

DrawElementsDrawRangeElementsDrawElementsInstanced 从其名稱繫結到的緩衝區物件中获取其索引 ELEMENT_ARRAY_BUFFER ,使用它们的indices引數作為到緩衝區物件的偏移量,其方式与10.3.9节中所述相同. [...]如果零繫結到 ELEMENT_ARRAY_BUFFER ,這些绘製命令的結果是不確定的。

所以我们不能使用glMapBuffer或glBufferSubData對映ELEMENT_ARRAy_BUFFER(或者可以吗?),以及 glDrawElements 確實接受了指向索引資料的指標,但是只有当我们不使用VAO和VBO時,如果使用它们,它將最後一个引數作為当前繫結的ELEMENT_ARRAy_BUFFER中的指標偏移量。

So what's the best way to deal with dynamic indices?

最新回復
  • 6月前
    1 #

    這是如何將資料上傳到GPU的想法:

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vboID);
    void *vbo = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
    memcpy(vbo, indices, byteSize);
    glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
    

  • Unity:Unity-从GameObject获取按钮功能
  • 3d meshes:Unity網格仅渲染一組三角形