ich brauche ein Kartenformat, dass Indoor und Outdoor kann. Welches würdet ihr mir empfehlen ? Gibt es für dieses Format schon einen Loader oder muss ich mich da selbst drum kümmern ?
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Mir ist kein einziges bekannt, welches effektiv und unter einer freien Lizens steht.
Deswegen behebe ich dieses defizit auch selber und entwickel aktuel an einem in und outdoor Format.
Octree basiert , mit Visible Tree und streambarer Struktur. Das ganze wird dann von einem SceneGraph gesteuert.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Ich habe mal wieder im Forum gesucht und bin dabei ständig auf Newton in Bezug auf Levels gestoßen. Und Newton lädt die Levels. Da ich Kollisionserkennung, 9,81 (Fall) und solche Sachen natürlich brauche, würde mich mal interessieren: macht es Sinn sich jetzt OHNE Newton drum zu kümmern oder verschwende ich nur Zeit, da Newton ganz anders funktioniert (ich kenn Newton nicht großartig, nur wenig mit zu tun gehabt) und ich alles nochmal umprogrammieren müsste ?
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Newton lädt Levels?
Versteh ich jetzt nicht?
Newton hat rein garnichts mit Grafik zu tun, das einzige was du machen kannst, ist die Geometrie deines Levels an Newton zu übergeben, entsprechende Körper (Würfel, Kugel, echte Geometry) zu definieren und auf deren Callbacks zu reagieren.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Ah, also "initialisiert" Newton mit LoadWorld (so heißt es doch?) die Physik für das Level ? Worauf müsste man eigentlich bei Outdoor achten ? Sieht momentan so aus, als sollte ich mir selbst die Arbeit machen, da ich dann mehr dabei lerne und es an sich imho schöner so ist.
Habe mich nochmal informiert. Sieht momentan nach Octrees aus. Das Beispiel zu den Octrees braucht sehr lange zum Laden, ist das nur bei diesem Beispiel so oder dauert das bei großen Levels sau lange ?
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Eigentlich gibt kein Patentrezept, es gibt viele Möglichkeiten ein Level zu speichern und zu laden, dann noch mehr Möglichkeiten es zu partitionieren.
Bisher wahren BSP und Portals als Partitionierung sehr beliebt und mittlerweile kommen Octrees immer mehr zum Einsatz. Früher wurde das ganze Level mit einmal geladen aber heute wird das Level überwiegend gestreamt. Der aufbau der Formate ändert sich auch, da die Hardware sich verändert. Man will ja nicht unnötig Zeit vertuen und deswegen werden die Daten schon Hardware nahe gespeichert. Es gibt einfach viele Faktoren und man sollte das Format nach seinen Ansprüchen aufbauen.
Mein Format basiert auf Chunks, wobei diese in Header und Daten unterteilt werden.
Es werden nur die Header geladen, da hier die Position, Ausrichtung, Skalierung und die Boundingsphere dienlich sind.
Neben den Informationen, des Platzes im Raum, liegen auch Typ ID, Name und Hash mit drin.
Momentan gibt es keine Unteteilung aber diese wird ein Octree sein und durch ein PVT unterstützt werden.
Sobald ein Objekt im Frustum landet werden die Daten geladen und dargestellt.
Die Hashes erlauben die Wiedererkennung von Daten und somit müssen schon geladene Daten nicht nochmal geladen werden sonden besorgen sich nur den Pointer der schon geladenen Daten. So kann man dem User überlassen, ob er Speicher schonend modelliert oder auf geschwindigkeit setzt.
Wobei dieses relativ ist. Die neueren Grafikkarten beherschen Instancing und da ist es sogar von größten Vorteil.
Dieses Bild z.B. ist mein Testlevel.
Es besteht aus ~600 Objekten und besitzt insgesamt 90k Triangle. Für jedes Triangle läuft noch ein Shader für Pixel lighting.
Wenn ich komplett rausgehe, um alle Objekte gleichzeitig zu rendern, dann habe ich 320FPS bei 800x600 auf einem AMD X2 4200+ und einer x1950Pro 128MB System. Stehe ich z.B. vor einem der Tore so habe ich ~1800FPS, da das Frustum einfach mal ein paar hundert Objekte entfernt.
Die ganze Szene ist 220KB groß und die ganze Demo braucht 16MB Speicher und ein bischen weniger VRam.
Ein Octree+PVT würde auf dem Bode viel Power mit sich bringen aber im Himmel würde es fast 0 bringen(1-2 Objekte die vieleicht verdeckt werden, könnten noch raus gefiltert werden). Also sollte man wohl wissen, was für ein Spieltyp ist es und kann ich überhaupt in die Luft.
Wenn ja, dann müsste jetzt weiter optimiert werden aber sonnst wäre man schon fertig.
Hier kann man nun optimieren, indem man die Objekte zusammen legt(die Anzahl der Objekte macht mehr zu schaffen als die Trianglezahl).
In beiden fällen müsste man aber das Mesh verändern und das kostet viel CPU Zeit(on the fly berechnung) oder ne menge Speicher(precomputed).
Eine Alternative ist das rausblenden von Objekten, man nimmt weiter entfernte Objekte einfach, man blendet sie über die entfernung aus und bei 0 wird das Objekt garnicht mehr verarbeitet. Dieses Funktioniert bei kleineren Objekten super und in der Regel hat man viele kleine Objekte(Bäume,Tische,Personen,Tiere,Steine,...) und wenig große(Gebäude). Diese Variante werde ich implementieren.
Man kann also sehen, es kommt ganz auf den Einsatz des Formates an und hier kann man vieles Falsch machen.
Meine Variante ist wohl nicht gerade eine normale Lösung, ich habe zumindestens noch nie eine solche Implementierung gesehen^^.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Ich brauche einen Algo, der vorallem schnell ist. San Andreas ist imho recht vorbildlich (lädt sehr schnell die Spielstände -> rendert schnell das Level). Vorerst sei gesagt, dass ich wohl noch sehr lange auf dem Boden bleibe und nicht mal kurz in einen Helikopter steige und Probleme mit der Darstellung hätte. Octrees sind denke ich ganz gut für meinen FPS-Zweck geignet. Wie macht man das denn mit dem Streamen ? Gibt es da eine Dokumentation oder ein Tutorial zu ?
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Streamen ist theoretisch eine einfache Sache.
Sagen wir, du hast ein Octree, dann guckst du, wo dein Player ist und lädst alle Nodes, die im sichtfeld von diesem sind.
Du musst also nur das Octree aus der File laden aber nicht die Daten oder Header jedes Nodes.
Im Octree sollte am besten nur die Offsetposition zu den Objekten in der Datei stehen.
Dann kann man in der Datei zu diesem Punkt springen, die Nodeheader laden und dann gucken was die Nodes so sagen.
Die Nodes könnten dann bei sichtbarkeit z.B. die Daten Laden und darstellen.
Wie du dann das laden von Daten zur Laufzeit realisierst ist eine Sache deiner Kreativität(1 Node weiter als Sichtweite vorladen,Laden bei anfrage,...).
Praktisch ist es aufjedenfall, die Daten über ein Thread laden zu lassen.
So kannst du weiter spielen und musst ned warten, bis alles geladen ist.
Die Daten werden dann über die Zeit geladen(Mesh->Material->Shader,Texturen) und dann das dargestellt, was da ist.
Wenn du Gothic oder mal WoW gespielt hast, dann sollte dir aufgefallen sein, dass nach einem Porten erst die Meshes ohne irgendwas gezeichnet werden.
Dann kommen Texturen grob,fein und Shader hinterher. Teleportieren hat bei Gothic ne animation und bei WOW ne Castdauer, ich schätze das in der Zeit schon angefangen wird, dass Mesh zu laden.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Mitglieder in diesem Forum: 0 Mitglieder und 7 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.