Ich habe eine Landschaft, die aus Höhendaten-Bildern generiert wird. Auf der Landschaft befinden sich 2D-Objekte, wie Strasse, Flüsse usw. Diese Objekte bestehen aus Polygonen, deren Positionen durch vorgegebene (x,y)-Koordinaten definiert sind. Diese Objekte sollen aber nicht flach gezeichnet, sondern so angehoben werden, dass sie auf dem Höhenterrain liegen.
Das Problem ist nun, dass die Koordinaten dieser Objekte nicht mit dem Gitternetz des Höhenterrains übereinstimmen. Das bedeutet zum einen, dass die Höhe für jeden Vertex eines Objektes aus benachbarten Gitterpunkten interpoliert werden muss, und zum anderen, dass längere 2D-Objekte wie Strassen in kleinere Stücke aufgeteilt werden müssen um auf das Höhenterrain gelegt werden zu können.
Da das ziemlich viel Rechnerei bedeutet, hab ich mir einen anderen Ansatz überlegt: Ich rendere all die sichtbaren 2D-Objekte offscreen in eine Gesamttextur (oder ein Buffer?) und "klebe" sie anschließend auf das Höhenterrain wie eine gewöhnliche Textur. Dadurch entfallen die ganzen Berechnungen, die ich sonst machen müsste.
Was ich nun gerne wissen würde, bevor ich mit dem Programmieren anfange (und dann womöglich scheitere), ist:
- Wie macht man so ein Rendern in eine Textur/Buffer? Das müsste am Besten im gleichen Renderpfad geschehen wie das Rendern der ganzen anderen Szenerie. Gibt es spezielle Techniken/Extensions dafür? Vielleicht auch Tutorials? (meine google-Suche hat leider nichts erbracht).
- Ist dieses offscreen Rendern schnell genug? Kann man damit flüssige Darstellung (über 25fps) erreichen?
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Je nachdem wie groß du deine Megatexture machen willst wäre es wahrscheinlich praktisch diese zu unterteilen.
Bin auch gerade überfragt ob man überhaupt ausserhalb des Viewports zeichnen kann....
wobei du das offscreen-rendern im optimalen fall ja nur einmal machst...
(meine "versuchs" landschaft rendere ich 3mal pro frame. ist noch nicht viel optimiert, läuft aber trotzdem so mit 90-120 fps ziemlich stabil (GF8600))
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn du diese Texturen sehr häufig ändern musst ist das klassische RenderToTexture eher nicht so prickelnd, da es nicht wirklich schnell ist. Wenn du sie nur ein einziges Mal erstellen musst dann spielt es wohl eher kaum eine Rolle. Aber bei dem klassischem RenderToTexture ist die maximal mögliche Größe der Textur von der Größe deines Renderbereiches abhängig. Also 1024x1024 sind bei Auflösungen von 1024x768 nicht möglich, da unterhalb etwas abgeschnitten wird. Als Alternative würde ich auf moderneren Grafikkarten eher Framebuffer Objects empfehlen.
Aber sonst solltest du bedenken, dass durch eine Textur durchaus Qualität verlohren gehen kann. Denn wenn du deine Objekte so in die Textur rendest haben sie eine feste Auflösung. Wenn du näher ran zoomen kannst dann wird es pixelig. Wenn du dafür aber die Tetxurgröße erhöhst benötigst du mitunter wesentlich mehr Speicher und beim wegzoomen kann es zu unschönen Effekten kommen, denn du hast keine MipMaps.
Da wir so nicht ganz abschätzen können was du eigentlich mit den Texturen vor hast musst du abwägen was du noch alles brauchen wirst. Aber ich denke der Weg über einen Offscreenbuffer ist schon mal nicht verkehrt.
In aktuelleren Spielen sieht man häufig nur diese Buffer, da das komplette Bild erst einmal in einen solchen Buffer geschrieben wird und anschließend noch solche Effekte wie Bloom, Spiegelungen im Wasser etc. darauf angewendet werden.
Ich dachte eigentlich nicht an ein Megatexture von der gesamten Landschaft. Mein Gedanke war, dass das was die Kamera grade sieht (z.b. ein Gebiet von 1x1km Größe) nicht auf den Bildschirm, sondern im Ortho-Modus auf ein Bild/Buffer gerendert wird. Anschließend wird das Bild auf die 3D-Landschaft gelegt.
Das Offscreen-Rendern würde ich dann in jedem Frame neu machen, so dass das Bild immer feiner wäre, wenn man sich näher an die Landschaft bewegt und umgekehrt immer gröber wenn man sich weiter weg entfernt. Dadurch würde ich hoffentlich auch die unschönen Pixel-Artefakte vermeiden.
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Wenn du deine Objekte als Textur auf deine Heightmap blenden willst, kannst du doch diese Textur außerhalb deines Programmes erstellen, vorausgesetzt sie bleibt statisch (was bei Straßen und Flüssen aber meistens der Fall ist ).
Also ich würde mir nen netten Editor schreiben, in dem du deine Straßen, Flüsse hübsch auf der Map verteilen kannst, und daraus wird dann einfach eine Textur erstellt, die du dann (evtl. gekachelt) über deine ganze Map legst.
Andernfalls kannst du auch die Textur in üblichen Bildbearbeitungsprogrammen wie Gimp zusammenbauen.
In dieser Textur kannst du dann noch, wo keine Straßen liegen, Gras, Sand oder ähnliche Oberflächen einsetzen.
Generell kann ich dir dafür dieses Tool empfehlen.
Leider kann man dort nicht die Höhen für jede Textur angeben. Falls das für dich ein Problem ist kann ich dir mal meine Version davon hochladen, die zwar keinen Schatten erstellen kann, bei der man aber die Höhen für die Texturen einstellen kann.
Also nochmal zusammengefasst:
Erst mit oben genannten Tool (oder mit meinem) eine Textur für die Heightmap erstellen.
Dann mit einem Editor deine Straßen und Flüsse in diese Textur einbauen.
Vielleicht habe ich dich auch falsch verstanden... In diesem Falle ignoriere alles
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Zitat:
Das Offscreen-Rendern würde ich dann in jedem Frame neu machen, so dass das Bild immer feiner wäre, wenn man sich näher an die Landschaft bewegt und umgekehrt immer gröber wenn man sich weiter weg entfernt.
Genau das ist Megatexture Zumindest wird es so in der idTech4 Engine (ETQW etc) verwendet. Und Meister Carmack nennt es eben Megatexture. Der Shader bekommt (ich glaube) 6 Mip-Texturen verpasst und bastelt daraus die Oberfläche zusammen. Nur der Unterschied liegt darin, dass dort der Shader die Arbeit übernimmt und die eigentlichen Daten schon fertig vorliegen und nur vom Programm zurecht gerückt werden müssen.
Ein Vorerstellen einer Megatexture (bzw. vieler kleinerer Texturen) kommt bei mir leider nicht in Frage, weil 1) die Objekte dynamisch verteilt werden und 2) die beim Vorerstellen benötigte Texturauflösung (ca im Dreh ganz Deutschland in 0,5m Auflösung) würde den Rahmen einer Megatexture sprengen und ich müsste dann einen Server oder ähnliches für das Verwalten der Texturen schreiben.
Die Vertexprojektionsberechnungen musst du doch für ein nicht animiertes objekt nur 1x machen. Da sehe ich den Vorteil vom in eine textur rendern nicht.
Falls sich die Objekte nicht überschneiden kannst du statt dessen auch einfach ein 2. set an texturkoords errechnen, und das dass mit multitexturing verwenden.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.