首頁  >  文章  >  後端開發  >  如何處理 OpenGL 索引緩衝區中不符合的頂點和法線索引?

如何處理 OpenGL 索引緩衝區中不符合的頂點和法線索引?

Susan Sarandon
Susan Sarandon原創
2024-11-24 05:11:12173瀏覽

How to Handle Mismatched Vertex and Normal Indices in OpenGL Index Buffers?

OpenGL 索引緩衝區:處理不同的索引

從3ds Max 等第三方軟體匯入自訂網格資料時,您可能會遇到以下差異:頂點和法線索引。由於 OpenGL 對頂點和法線都使用單一索引緩衝區,這帶來了挑戰。

解決方案 1:組合頂點和法線資料

一種方法是建立一個包含頂點資料和法線資料的組合頂點緩衝區。這需要識別唯一的(頂點索引、法線索引)對並為每對建立一個新頂點。

使用 STL 映射,為每個(頂點索引、法線索引)對建立一個鍵。迭代三角形,檢索每個角落的(頂點索引,法線索引)對,並檢查地圖中是否存在現有條目。如果沒有,則使用combinedVertices數組中對應的頂點和法線座標建立新頂點並更新貼圖。最後,將每個頂點的組合索引加入到combinedIndices數組中。

範例偽代碼:

nextCombinedIdx = 0
indexMap = empty
for triangle in input file:
    for corner in triangle:
        vertexIdx = ...
        normalIdx = ...
        if key(vertexIdx, normalIdx) in indexMap:
            combinedIdx = indexMap[key(vertexIdx, normalIdx)]
        else:
            combinedIdx = nextCombinedIdx
            indexMap[key(vertexIdx, normalIdx)] = combinedIdx
            nextCombinedIdx = nextCombinedIdx + 1
            combinedVertices[combinedIdx] = inVertices[vertexIdx], inNormals[normalIdx]
        combinedIndices[combinedIdx] = combinedIdx

解決方案2:排序資料

或者,您可以對頂點/法線資料進行排序以使其相容於使用glDrawArrays。但是,如果您有重複的頂點,這可能會出現問題。

您需要建立從原始頂點索引到新排序索引的對應。當遇到重複頂點時,為其分配先前見過的對應頂點的索引。然而,這種方法可能需要大量的資料處理和重組。

以上是如何處理 OpenGL 索引緩衝區中不符合的頂點和法線索引?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn