2017-05-10 4 views
1

Die einzelnen Pixel/Werte in einer Heightmap ergeben nur ein 2D-Gitter aus Scheitelpunkten mit unterschiedlichen Höhen, daher müssen Sie sie mit Quads verbinden. Das ist einfach genug, wenn alle 4 Eckpunkte eines Quads koplanar sind, aber wenn sie nicht vorhanden sind, brauchen Sie eine Teilungsregel. Eine Möglichkeit besteht darin, die kürzere/längere Kante auszuwählen, eine andere, um die höhere zu verwenden, etc ... Eine andere Ich habe herausgefunden, dass Arbeiten einen Mittelpunkt für das Quad (Durchschnitt aller 4 Höhen) berechnet, obwohl dies die Anzahl verdoppelt von Dreiecken, die weit von optimal ist.Korrekte Möglichkeit, Quads für Gelände aus Heightmap zu teilen?

Was ist der richtige Weg, um Quads zu trennen? Oder gibt es eine Alternative zu Quads?

Antwort

1

Die allgemeine Regel ist, dass Aufteilungen auf die Krümmung der lokalen Oberflächenkrümmung ausgerichtet werden sollten. Eine einfache diagonale Teilung funktioniert für Flächen mit einer Gauß'schen Krümmung von 0 (Ebenen, Zylinder), aber eine Verfeinerung der Mittelunterteilungsaufteilung wird für eine Gaußsche Krümmung ungleich Null empfohlen.

1

Ich würde überhaupt keine Quads verwenden. Für praktische Geländehöhenkarten sind Höhen niemals koplanar, und die GPU zieht Quads nicht zu Dreiecken vor, sondern unterteilt das Quad in 2 Dreiecke.

Allerdings würde mich die Splitting-Regel nicht interessieren. Aus meiner Erfahrung mit Terrain-Renderern besteht eine der besten Möglichkeiten darin, eine kleine 2D-Dreiecksnetzkachel (wie 128x128 Scheitelpunkte) zu erstellen und sie so oft wie nötig zu wiederholen, wobei eine Heightmap pro Kachel als Textur übergeben wird.

Der Grund für die Wiederholung der gleichen 2D-Kachel anstelle eines typischeren 3D-Netzes ist, dass die Speicherauslastung und Speicherbandbreite stark reduziert werden. Wenn Sie das 3D-Netz verwenden, benötigen Sie wahrscheinlich 3xFP32-Werte (pro Vertex). das wird zu 4xFP32 (128bits) gepolstert, aber wenn Sie meinen 2D-Kachel-Ansatz verwenden, benötigen Sie nur 2xU8 (16 Bit) + 1xFP16 (16 Bit) = 32 Bit. Das ist eine Reduzierung der Speicherbandbreite um das Vierfache, die Speichernutzung wird sogar noch besser: 8x weniger Speicherverbrauch. Denken Sie daran, dass Sie, wenn Sie nicht über einen sehr komplexen Fragment-Shader verfügen (unwahrscheinlich für einen Terrain-Renderer), in den meisten GPUs über eine Speicherbandbreite verfügen.

Kombinieren Sie dies mit Quad-Bäumen (für LOD) und mit normalen Karten und Sie werden ein sehr gutes Qualitäts-/Leistungsverhältnis haben.

+0

Wie soll ein solches 2D Dreiecksnetz funktionieren? Können Sie ein Beispiel angeben/verlinken? Auch wenn ich quad sage, meine ich ein Paar aus zwei Dreiecken, die ein Viereck bilden, d. H. Ich mache das Vierfach-Teilen auf der CPU und rende mit "GL_TRIANGLES". – Wingblade

+0

Ich habe keine Verbindung, aber ... Das 2D-Dreieck-Netz ist nur ein Netz wie folgt: http://photos1.blogger.com/blogger2/2483/1050461954730077/320/Mesh.0.jpg Es ist nur ein reguläres Netz, und die Aufteilung ist immer in der gleichen Richtung. Die Höhe jedes Eckpunkts würde durch Abtasten einer 2D-Textur, der Höhenkarte, berechnet. – dv1729

Verwandte Themen