Boden in OpenGL Landschaft
-
Hallo alle zusammen,
Ein paar Freunde und ich Programmieren eine kleine 3D Landschaft. Unsere Objekte binden wir mit hilfe von 3DS ein. Funktioniert wunderbar. Aber irgendwie können wir uns nicht vorstellen den kompletten Untergrund mit 3DS machen.
Kann uns jemand Helfen wie wir das am besten machen mit 3DS oder Octree oder NURBS direkt Coden?Grüße
Burcher
-
stBurcher schrieb:
Kann uns jemand Helfen wie wir das am besten machen mit 3DS oder Octree oder NURBS direkt Coden?
nurbs wären natürlich die edellösung und in ein paar jahren können wir dann wahrscheinlich der karte einfach ne heightmap hinknallen und sagen "los, mach mal displacement mapping".
die einfachste methode wenn die landschaft "flach" ist (also keine höhlen oder überhänge) ist eine heightmap. selbst mit solchen features könnte man drüber nachdenken und sie einfach als "objekt" einbauen (und dafür an der stelle keine landschaft rendern.. farcry scheint das zu machen).
für ausgefallene landschaften könnte man die natürlich auch als modell erstellen, aber zerschnitten in viele kleine stücke (wie bei der heightmap, nur halt "von hand"). allerdings sollte man dann darauf achten, daß alle detailstufen die vertices am rand an der gleichen stelle haben (sonst paßt hinten und vorne nichts mehr zusammen und man hat lustige sprünge und risse).
octree ist in 99% der fälle overkill für eine landschaft, weil sie selten wirklich 3 dimensionen hat.
2 varianten (die aber beide geomipmaps benutzen, nur einmal für "unendliche" landschaften und einmal für möglichst große mit hoher sichtweite) gibts hier:
http://festini.device-zero.de/Programming/Downloads/index.xml
einmal das framework und einmal die landschaft (hoffentlich leicht erkennbar).wer sich weigert einen anständigen browser zu benutzen braucht diese seite:
http://festini.device-zero.de/downloads/index.shtmlder code ist nicht aktuell, auf anfrage gibts auch den neuen. beide brauchen karten mit fragment program support (neuere radeon ab ca. 9700 oder gf fx).
die ganz grundlegende methode:
die landschaft wird in viele stückchen zerlegt (je nach wunsch irgendwo zwischen 17x17 und 64x64). für jedes stück gibt es unterschiedliche detailstufen (jedes 2., 4., 8. vertex benutzen, etc.). dazu braucht man pro stufe aber nur EINMAL den indexbuffer (wer jetzt anfängt tausend buffer anzulegen sollte gründlich nachdenken, ob das nicht einfacher geht).je nach größe der karte passiert culling entweder mit quadtree oder "bruteforce" (bis zu einer bestimmten größe verschwendet man mehr zeit mit dem ganzen baumgedöns als einfach stur zu testen, vor allem wenn der baum ineffizient aufgezogen und/oder am ende noch mit rekursion durchlaufen wird).
eine der landschaften nutzt occlusion culling, indem jedes stück zwei.. egal, einfach auf wireframe schalten und die occ rectangles einblenden, dann wirds schnell klar.
die andere landschaft ist auf möglichst kleinen speicherverbrauch geprügelt, um noch bis zu 8kx8k landschaften hinzubekommen, obwohl man ab der größe langsam über eine angemessenere methode nachdenken sollte. (klappt vermutlich nur auf nvidia, ati ist heikel beim vertex format und bricht so ein, daß ein float nicht mehr genau genug ist um die fps darzustellen.. nvidia bescheißt entweder intern -und speichert heimlich immer als float- oder ist schlicht nicht so bescheuert derart radikale einschränkungen einzubauen, nur um irgendwo 2% mehr leistung zu scheinden).
und ja, sie benutzt heightmap und texturen von farcry, um einen leichteren vergleich zu haben, auch wenn deren karten mit 1024x1024 ein bißchen klein sind ,-)