Heim > Backend-Entwicklung > C++ > Wie gehe ich mit nicht übereinstimmenden Vertex- und Normalindizes in OpenGL-Indexpuffern um?

Wie gehe ich mit nicht übereinstimmenden Vertex- und Normalindizes in OpenGL-Indexpuffern um?

Susan Sarandon
Freigeben: 2024-11-24 05:11:12
Original
198 Leute haben es durchsucht

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

OpenGL-Indexpuffer: Adressierung unterschiedlicher Indizes

Beim Importieren benutzerdefinierter Mesh-Daten aus Software von Drittanbietern wie 3ds Max kann es zu Diskrepanzen zwischen diesen kommen Scheitelpunkt- und Normalindizes. Da OpenGL einen einzigen Indexpuffer sowohl für Scheitelpunkte als auch für Normalen verwendet, stellt dies eine Herausforderung dar.

Lösung 1: Vertex- und Normaldaten kombinieren

Ein Ansatz besteht darin, einen zu erstellen kombinierter Scheitelpunktpuffer, der sowohl Scheitelpunkt- als auch normale Daten enthält. Dies erfordert die Identifizierung eindeutiger Paare (Scheitelpunktindex, normaler Index) und die Erstellung eines neuen Scheitelpunkts für jedes Paar.

Erstellen Sie mithilfe von STL-Karten einen Schlüssel für jedes Paar (Scheitelpunktindex, normaler Index). Durchlaufen Sie die Dreiecke, rufen Sie die (Scheitelpunktindex, Normalindex)-Paare an jeder Ecke ab und prüfen Sie, ob in der Karte ein Eintrag vorhanden ist. Wenn nicht, erstellen Sie einen neuen Scheitelpunkt mit den entsprechenden Scheitelpunkt- und Normalkoordinaten im CombinedVertices-Array und aktualisieren Sie die Karte. Fügen Sie abschließend den kombinierten Index für jeden Scheitelpunkt zum Array „combinedIndices“ hinzu.

Beispiel-Pseudocode:

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
Nach dem Login kopieren

Lösung 2: Daten sortieren

Alternativ können Sie die Vertex-/Normaldaten sortieren, um sie mit glDrawArrays kompatibel zu machen. Dies kann jedoch problematisch sein, wenn Sie doppelte Scheitelpunkte haben.

Sie müssten eine Zuordnung von den ursprünglichen Scheitelpunktindizes zu ihren neuen sortierten Indizes erstellen. Wenn Sie auf einen doppelten Scheitelpunkt stoßen, weisen Sie ihm den Index seines zuvor gesehenen Gegenstücks zu. Dieser Ansatz kann jedoch eine umfangreiche Datenverarbeitung und -umstrukturierung erfordern.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit nicht übereinstimmenden Vertex- und Normalindizes in OpenGL-Indexpuffern um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage