Frage

Hey Leute, ich mache eine alte Geometrie aus einem alten Spiel. Ihr Kunde hatte einen Algorithmus, der es ihnen ermöglichte, herauszufinden, welche Bereiche sich in der Nähe befanden, aber ich habe diese Fähigkeit nicht, also suche ich, die unnötigen Polygone zu keulen. Derzeit mache ich jedes einzelne Polygon in der gesamten Zone, unabhängig davon, ob ich es sehen kann oder nicht, unabhängig davon, ob es sich auch in visueller Reichweite befindet. Offensichtlich ist das völlig ineffizient. Meine Frage:

Welche Art von Keulen sollte ich verwenden. Ich weiß, ich kann Polygone nicht im Frustum kullieren, und das hilft, einen Teil der Ladung zu lindern, aber ich kann sagen, dass ich nicht sagen kann, dass sie keine Polygone rendern, die einen gewissen Abstand von der Kamera sind? Wie heißt das? Ich benutze auch Nebel in einigen Bereichen. Gleiche Frage lautet. Kann ich mir einen Weg finden, in dem ich alles, was hinter dem Nebel liegt, und den Bereich, den ich nicht sehen kann, keuchen kann?

Danke: Ein Screenshot dieser laufenden Arbeit. Einige Leute erkennen es vielleicht auch :) Auch die hässlichen Farben für die Blätter ignorieren. Ich habe keine Alpha -Maskierung berücksichtigt.

Bild: http://i.stack.imgur.com/duc2i.png

War es hilfreich?

Lösung

Es gibt zwei verschiedene Sache zu berücksichtigen: Möchten Sie es einfach richtig aussehen, dh versteckte Oberflächenentfernung? Dann erledigt einfache Tiefenprüfung den Job; Der Overhead ist, dass Sie Geometrie verarbeiten, die es überhaupt nicht auf dem Bildschirm schaffen. Wenn dies jedoch ein (sehr) altes Spiel ist, haben Sie die Daten genommen, es ist sehr wahrscheinlich, dass eine vollständige Karte mit all den Vermögenswerten weniger Polygone hat als das, was in modernen Spielen auf einem Sieb sichtbar ist. In diesem Fall werden Sie keine Leistungsprobleme betreiben.

Wenn Sie wirklich auf Leistungsprobleme stoßen, müssen Sie ein Gleichgewicht darüber finden, wie viel Zeit Sie ausgeben möchten, das feststellen, was (nicht) sichtbar ist, und tatsächlich zu rendern. Vor 10 Jahren war es immer noch entscheidend, fast Pixel perfekt zu sein, um so viel Rasterzeit wie möglich zu sparen. Moderne GPUs haben so viel Ersatzkraft, dass es ausreicht, nur eine grobe Auswahl zu treffen, was in das Rendering einbezogen werden soll.

Diese Berechnungen liegen jedoch vollständig außerhalb des Rahmens von OpenGL oder einer anderen 3D -Raster -API (z. B. Direct3D) - ihre Aufgabe zeichnet nur Dreiecke mit anspruchsvollen Rasterisierungsmethoden auf den Bildschirm. Es gibt keine Objektverwaltung, keine höheren Funktionen. Es liegt also an Ihnen, dies zu implementieren.

Der typische Ansatz besteht darin, eine räumliche Unterteilungsstruktur zu verwenden. Am beliebtesten sind KD -Bäume, Octrees und BSP -Bäume. BSP -Bäume sind räumlich sehr effizient, aber schwerer in der Berechnung. Persönlich bevorzuge ich eine Hybrid/Kombination aus KD -Baum und Octree, da diese leicht zu ändern sind, um dynamische Veränderungen in der Szene zu befolgen. BSP -Bäume sind viel schwerer zu aktualisieren (erfordert in der Regel eine vollständige Neukomputation).

Bei einer solchen räumlichen Strukturierung ist es sehr leicht zu bestimmen, ob ein Punkt in einer bestimmten interessierenden Region liegt. Es ist auch sehr einfach, Knoten im Baum durch geometrische Einschränkungen wie Flugzeuge auszuwählen. Dies macht die Implementierung eines groben keulen Keulens sehr einfach: Man verwendet die frustum -Clipping -Flugzeuge, um alle Knoten aus dem Baum innerhalb der Flugzeuge auszuwählen. Damit das GPU -Leben leichter ist, möchten Sie vielleicht die Knoten in der Nähe von weitem sortieren. Auch hier hilft Ihnen die Baumstruktur dort, da Sie den Baum rekursiv sortieren können, was zu einer nahezu optimalen O- (N -Log (N)) -Komplexität führt.

Wenn Sie weiterhin die Rendering -Leistung verbessern müssen, können Sie die vom Baum definierten räumlichen Spaltungen verwenden, um (unsichtbar) die Geometrie in einem Testen zu testen Okklusionsabfrage, bevor sie in die unter den getestete Grenzen begrenzte Subtree eingeschränkt sind.

Andere Tipps

Ich weiß, ich kann Polygone nicht im Frustum kullieren, und das hilft, einen Teil der Ladung zu lindern, aber ich kann sagen, dass ich nicht sagen kann, dass sie keine Polygone rendern, die einen gewissen Abstand von der Kamera sind? Wie heißt das?

Dies geschieht bereits durch das Frustum selbst. Das FAR -Flugzeug setzt eine Kamera -Abstandsbegrenzung auf das zu rendernde Objekt.

Sich ansehen glfrustum.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top