|
LOD für alle |
Top Previous Next |
|
Die teureren A6 Versionen erlauben es, ein Feature namens “Level of Detail” oder kurz LOD zu verwenden. Es handelt sich dabei um einen einfachen und effektiven Weg, große Level zu haben, ohne dass der Prozessor oder die Grafikkarte zu stark belastet werden. Wie funktioniert LOD? Wenn die Kamera weit von einer Entity (einem Model, einem Sprite, etc.) entfernt ist, wird diese Entity automatisch durch eine andere ersetzt, die weniger Polygone, einen weniger hochauflösenden Skin etc. besitzt. Dieser Prozess kehrt sich um, wenn die Kamera wieder näher kommt.
Der LOD Code den ich verwende ist einfach, effizient und hat eine Reihe von Vorteilen, die (hoffentlich) auch Nutzer von besseren A6 Versionen dazu bringen wird ihn zu verwenden: - Auch Nutzer von A6 Lite und A6 Standard können LOD Entities verwenden; - Sie können für jede Entity individuelle LOD Abstände definieren; - Sie können den Code dahingehend erweitern, dass jede Entity eine beliebige Anzahl von LOD Stufen besitzt; - Der Code kommt mit wenig Ressourcen aus.
Ich habe ein Projekt erstellt, das den Code in Aktion zeigt, Sie müssen also nur level1.wmp öffnen und mit der main.wdl zusammen starten. Sie werden das folgende Bild sehen:
Bewegen Sie sich dann mit Hilfe der WASD Steuerung auf die Kugeln zu und Sie werden feststellen, dass sie ersetzt werden:
Noch näher an den Kugeln werden diese abermals ersetzt:
Diese drei LOD Models werden automatisch ersetzt, wenn man sich nähert oder sich weiter weg bewegt. Für die Demo habe ich identische Models mit verschiedenen Farben für die Skin benutzt, aber in der Praxis sollten Sie ein Model mit vielen Polygonen für die Nahansicht und ein Model mit wenig Polygonen für die Ansichten aus größerer Distanz haben.
Wie bauen Sie den LOD Code in Ihre eigenen Projekte ein? Zunächst müssen Sie die lod.wdl Datei in Ihr Skript einbinden. Fügen Sie dann eine einzelne Codezeile zu denjenigen Actions hinzu, die LOD Models zugeordnet werden:
new_lod();
Das wars schon! Hier ist eine vereinfachte Version der Action für die Kugeln:
action lod_example { new_lod(); // call the lod function while (1) // your regular action should be put here { my.pan += 1 * time; wait (1); } }
Die Action hier verwendet die voreingestellten LOD Schritte, die im lod.wdl auf 300 bzw. 1000 Quants gesetzt sind. Diese Werte können beliebig an Ihre Bedürfnisse angepasst werden, oder Sie können sogar die LOD Schritte für die Entities separat angeben, so wie ich es für die Kugeln aus der Demo getan habe:
action lod_example { my.skill19 = 500; // set the first lod step (don't use the default step = 300 quants) my.skill20 = 1200; // set the second lod step (don't use the default step = 1000 quants) new_lod(); // call the lod function while (1) // your regular action should be put here { my.pan += 1 * time; wait (1); } }
In diesem Beispiel wird der erste Schritt (my.skill19) auf 500 Quants und der zweite (my.skill20) auf 1200 Quants festgelegt; auf diese Weise können Sie die Abstände bei denen umgeschaltet wird für jede Entity festlegen und müssen nicht eine globale LOD Distanz für alle Models haben.
Wie bereiten Sie die Models vor? Das erste, hochauflösende Model muss “name-1.mdl” heißen (wo “name” natürlich ein beliebiger Name ist), das nächstkleinere “name-2.mdl” und das dritte dann “name-3.mdl”. Der Code verwendet die Namen, die WED den Entities zuweist, stellen Sie also sicher, dass Sie neue Entities mit frischen Actions einfügen. Ersetzen Sie nicht ein Model durch ein anderes mit anderem Namen, das noch die alte LOD Action hat – das funktioniert nicht, bis Sie das Model löschen und im WED ersetzen.
Das ist alles! Natürlich funktioniert der Code ebenso für Map Entities und Sprites.
|