Unterteilung von Höhenfeldern

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
dot
Establishment
Beiträge: 1752
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Unterteilung von Höhenfeldern

Beitrag von dot »

Mach dir nix draus, Bufferless Draw ist, wenngleich ungemein toll, wohl eines der weniger bis kaum bekannten Features von D3D11... ;)

Edit: LOD sollte sich mit der Technik, denk ich, ganz gut umsetzen lassen, braucht nur einen anderen Index Buffer für den jeweiligen LOD und los gehts. Tessellation ist da aber wohl natürlich eine Sache, die man sich zumindest überlegen sollte...
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Unterteilung von Höhenfeldern

Beitrag von Niki »

Meinst Du Hardware Tessellation? Das wäre ja so schön, weil so herrlich einfach. Nur weiß ich leider nicht wie ich das Kollisionsproblem lösen soll. In meinem Falle sieht der Spieler die Welt durch eine First-Person Kamera. Da kann man mit einer bilinearen Interpolation von Höhen ja noch tricksen. Aber da sollen auch noch NPCs und Monster rumlaufen. Für die muss ich die Terrainhöhe unter den Füssen ermitteln. Und wenn da plötzlich eine krasse Steigung ist, dann ist es nicht mehr egal ob ein Quad / oder \ in Dreiecke unterteilt wird. Ich mag definitiv keine NPCs die oben auf'm Berg in der Luft schweben oder halb im Boden versinken :)
Aber wer weiß... vielleicht ist's ja wieder nur mangelndes Wissen meinerseits. Weißt Du eine Lösung für das Problem? Für mich wäre Hardware Tessellation dann die ultimative Lösung.

EDIT: Ich habe da eine Idee die hinhauen könnte. Je höher die Auflösung der Heightmap, desto weniger weicht eine bilinear interpolierte Höhe von dem ab was der Tessellator rendert (unter der Voraussetzung das der Tessellator auch mindestens dieselbe Auflösung nimmt). Wenn ich nun die Heightmap in der niedrigen Auflösung lasse, aber im Tessellator extra Höhen bilinear interpolieren, dann sollte ich doch in der Lage sein eine interpolierte Kollisionshöhe aus der Heightmap zu nutzen?! Klar ist das nicht 100% genau, könnte aber genau genug sein. Was denkt Ihr?
Benutzeravatar
dot
Establishment
Beiträge: 1752
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Unterteilung von Höhenfeldern

Beitrag von dot »

Für die Kollision sollten doch auf jeden Fall die Höhendaten ausreichen, oder? Aber rein prinzpiell wirst du die Physik ja wohl auf der CPU rechnen und brauchst entsprechende Daten also sowieso nochmal irgendwo im RAM...
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Unterteilung von Höhenfeldern

Beitrag von Niki »

Da hast du mich falsch verstanden. Ich versuch's mal etwas visueller. Zeichne ein Quadrat auf ein Blatt Papier und benenne die Ecken mit A, B, C, und D. Dieses Quadrat stellt ein einzelnes Quad aus dem Terrain dar (zwei zusammengehörige Dreiecke). A, B, C, und D haben je eine Höhe aus der Heightmap. Nimm als Beispiel A=0, B=0, C=0, und D=100. Du hast zwei Möglichkeiten das Quad in zwei Dreiecke zu unterteilen:

Fall 1: Hypotenuse geht von A nach C
Fall 2: Hypotenuse geht von B nach D

Jetzt möchtest du die Höhe in der Mitte des Quads wissen. Für Fall 1 ist diese Höhe 0, aber für Fall 2 ist sie 50. Das ist ein großer Unterschied, und je größer die Quads auf dem Bildschirm erscheinen desto stärker fällt dieser Unterschied auf (NPCs schweben über dem Boden oder versinken darin). Ob der Tessellator nun Fall 1 oder Fall 2 nimmt, das weiß nur der Tessellator, nicht aber die CPU die versucht die Höhen immer mit Fall 1 zu berechnen.

Je kleiner die Quads nun auf dem Bildschirm werden desto weniger sollten diese Fehler optisch auffallen. Deshalb die Idee das sowohl die Hull/Domain-Shader als auch die CPU neue Höhen mittels irgendeiner Interpolation hinzufügen. Dadurch sollte der Fehler geringer und optisch akzeptabler werden. So hoffe ich jedenfalls...
Benutzeravatar
dot
Establishment
Beiträge: 1752
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Unterteilung von Höhenfeldern

Beitrag von dot »

Das ist mir schon klar, was mir nicht klar ist, ist inwiefern das für die Kollisionsabfrage relevant ist!?
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Unterteilung von Höhenfeldern

Beitrag von Niki »

dot hat geschrieben:Das ist mir schon klar, was mir nicht klar ist, ist inwiefern das für die Kollisionsabfrage relevant ist!?
Du renderst einen NPC so das die Füße des NPCs in der Mitte des Quads auf dem Boden stehen. Die CPU nimmt Fall 1 und bestimmt "Ok, die Füße stehen an Höhe 0". Der Tessellator entscheidet sich aber nun evtl. für Fall 2, womit die Füße an Höhe 50 sein sollten. Sind sie aber nicht. Die Füße sind bei Höhe 0 und damit verschwindet ein Teil des NPCs optisch im Boden.
Benutzeravatar
dot
Establishment
Beiträge: 1752
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Unterteilung von Höhenfeldern

Beitrag von dot »

Naja, der einzige Weg um das richtig hinzubekommen, ist eben auf der CPU die gleiche Interpolation durchzuführen, wie du sie auf der GPU bei der Tessellation anwendest... ;)
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Unterteilung von Höhenfeldern

Beitrag von Niki »

dot hat geschrieben:Naja, der einzige Weg um das richtig hinzubekommen, ist eben auf der CPU die gleiche Interpolation durchzuführen, wie du sie auf der GPU bei der Tessellation anwendest... ;)
Bingo! Zwar kann ich meines Wissens nach der GPU nicht sagen "Nimm immer Fall 1, wie die CPU auch", aber durch das Hinzufügen neuer interpolierter Höhen (die auch nicht in Heightmap-Textur existieren) sollte ich hoffentlich in der Lage sein das Problem auf ein akzeptables Maß zu reduzieren. Diese Interpolation wird dann von CPU und GPU durchgeführt. Von der CPU für die Kollision und von der GPU für's visuelle. Mit etwas Glück haut das ganze vielleicht auch für Hardware LOD noch relativ gut hin. Na, ja, da gibt's halt viel zu probieren, aber glücklicherweise habe ich für das Terrain recht viel Zeit eingeplant :)
Benutzeravatar
dot
Establishment
Beiträge: 1752
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Unterteilung von Höhenfeldern

Beitrag von dot »

Wenn du Tessellation verwenden willst, kannst du das der GPU sogar ganz genau sagen, da du den entsprechenden Shader (DomainShader) sowieso selber schreiben musst... ;)
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Unterteilung von Höhenfeldern

Beitrag von Niki »

Im ernst? :o Wie? Da muss ich wohl irgendwas falsch machen?! Bei mir mischt der Tessellator Fall 1 und Fall 2.

EDIT: Beispiel Image hochgeladen. Hoffe das funzt. Selten das man bei einem Forum was hochladen kann. In dem Bild ist das gesamt Terrain nur ein einziger Patch. Die Fälle wechseln also innerhalb des Patches.
Dateianhänge
Tessellation
Tessellation
Zuletzt geändert von Niki am 26.03.2013, 16:14, insgesamt 1-mal geändert.
Benutzeravatar
dot
Establishment
Beiträge: 1752
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Unterteilung von Höhenfeldern

Beitrag von dot »

Achso, sry, da hatte ich was falsch verstanden, das kannst du natürlich nicht beeinflussen. Die Frage ist allerdings, ob das auch wirklich so ein Problem ist...
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Unterteilung von Höhenfeldern

Beitrag von Niki »

dot hat geschrieben:Achso, sry, da hatte ich was falsch verstanden, das kannst du natürlich nicht beeinflussen. Die Frage ist allerdings, ob das auch wirklich so ein Problem ist...
Ich fürchte ja :( Zumindest ist das ein wirklich hässliches Problem wenn du ein low-res 4096x4096 Höhenfeld auf ein riesiges Spielfeld anwendest. Du hast dann halt große Quads und NPCs die optisch durch Bergränder durchlaufen oder darüber hinweg schweben. Deswegen will ich ja versuchen die Auflösung künstlich zu erhöhen ohne die Gesamt-Heightmap zu vergrößern. Ich hoffe es klappt so wie ich es mir vorstelle.
Antworten