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
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!