Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Zitat:
Die Funktion lautet function TFrustum.IsBoxWithin(const pX, pY, pZ, pB, pH, pT : Single) : Boolean. Es werden also Breite, Höhe, Tiefe als Parameter übergeben.
Sry. Hatte ich missverstanden.
Aber mir ist noch was aufgefallen: FrustumVect enthält die Höhe des Terrains in der Mitte und pH bekommt die Hälfte der Höhe an der Stelle? Könnte es dann nicht sein, dass irgendwo in der Zelle Vertices ausserhalb der zu testenden Box liegen und diese deswegen zu früh gecullt werden?
_________________ 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"
FrustumVect enthält die Höhe des Terrains in der Mitte und pH bekommt die Hälfte der Höhe an der Stelle? Könnte es dann nicht sein, dass irgendwo in der Zelle Vertices ausserhalb der zu testenden Box liegen und diese deswegen zu früh gecullt werden?
Ja stimmt. Danke. Das Culling funktioniert jetzt auch soweit. Prinzipiell läuft auch schon alles recht passabel, wobei ich noch keine VBOs benutzt habe.
Allerdings ist jetzt mein Problem, dass die maximale Auflösung (also maximal reingezoomt) durch die Größe der QuadTreeMatrix beschränkt wird. Habe ich jetzt Beispielsweise eine Matrix 4000x600 (teilweise sind die Matrizen weit weg von quadratisch), dann müsste ich, um die volle Auflösung zu erhalten doch eine QuadTreeMatrix in der Größe 4097x4096 (2^n+1) benutzten. Sehe ich das richtig?
Außedem ist mir aufgefallen, dass die Auflösung oft an den falschen Stellen erhöht wird. Also die Auflösung ist nicht immer dort hoch wo auch die Kamera am nächsten ist. Kann das daran liegen, dass die Rotation nicht mitgerechnet wird? Also, dass das Drehen der Oberfläche mit glrotate sichnicht auf der KameraPosition-Array auswirkt und deshalb der Abstand falsch berechnet wird?
BTW: Habe die Y-Position der Kameraposition und die Höhe mit in die Abstandsberechnung einbezogen. Also das V1[1] := 0; in der Distance-Funktion gelöscht und CellCenterPos[1] := 0; in CellCenterPos[1] := GetHeightMapHeight(X,Z); geändert.
Also bin jetzt fast fertig mit meinem Programm. Culling und LOD funktionieren jetzt sehr gut. Die Performance ist relativ akzeptabel. Bei einer 4000x4000er Matrix komme ich auf knapp 20-40 fps. Die Farbgebung habe ich jetzt mit einer Textur gelöst, die immer in voller Auflösung über den Quadtree gelegt wird.
Wen es interessiert: Um den Abstand zur Kamera zu berechnen, habe ich die Kameraposition (nach gltranslate, glrotate) folgendermaßen errechnet:
Jetzt habe die aber noch ein paar Probleme: 1) Die Performance ist noch nicht optimal. Ich würde gerne VBOs verwenden, aber ich weiß noch nicht genau wo und wie ich das anstellen soll. Hat einer ne Idee (am Beispiel des Quadtree-Tutorials)? 2) Bei vollem Zoom sollte eigentlich die Oberfläche in voller Auflösung erscheinen. Reicht es, wenn ich ein sehr großes C einstelle (ca. 40)? Und muss ich bei nicht-quadratischen Matrizen dann einen Quadtree definieren, der mindestens so groß wie die längste Seite der Oberfläche ist? Der Quadtree und die HeightMap werden auf Byte komprimiert. Meine Messdate liegen als Single vor. Diese habe ich mit Round((Matrix[x,z]-hmin)/(hmax-hmin)*255) auf Byte komprimiert. Ich habe zum testen die Heightmap und den Quadtree auf Single umgestellt. Habe aber eigentlich kaum einen Unterschied feststellen können.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
du könntest die Performance noch etwas verbessern, wenn du eine Front-To-Back-Sortierung auf deine Blöcke anwendest. Occlusion_Query könnte vielleicht auch noch etwas bringen.
Viele Grüße dj3hut1
_________________ Wenn Gauß heute lebte, wäre er ein Hacker. Peter Sarnak, Professor an der Princeton University
Zum OcclusionQuerry gibt es eine sehr hilfreiche erweiterung seit neuem, wurde auf der Apple WWDC gezeigt:
Zitat:
NV_conditional_render
Normalerweise mußt du wenn du den query abfragst, also wieviele Pixel sichtbar waren solange warten bis die Grafikkarte gerendert hat, du arbeitest also nicht asynchron. Das kann sehr viel Performance kosten.
Um das zu umgehen wurde die obige Extension eingeführt, mit ihr verlagerst du den check, ob etwas sichtbar ist auf die Grafikkarte:
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.