Die -Engine unterstützt veschiedene Arten von in einem Level platzierten 3D-Objekten - Entities. Entities können per Skript erstellt, oder per WED im Level platziertwerden. Sie haben keinen Einfluß auf den BSP-Tree, unterliegen jedoch dem BSP/PVS-Culling. Sie werden nicht in der Level-Datei gespeichert, sondern sind externe Dateien, die aus dem Work-Ordner oder dem Pfad gelesen werden. Die folgenden Arten von Entities werden unterstützt:
Ein Sprite ist ein flaches 2D-Objekt, das für mehrere Zwecke eingesetzt werden kann. Es kann wie ein 'Abziehbild' (Decal) flach an eine Wand oder auf den Boden gesetzt werden; es kann wie ein Verkehrsschild (Billboard) aufrecht in der Landschaft stehen oder sich pseudo-3D verhalten, wobei es sich immer der Kamera zuwendet. Sprite Entities werden als externe Bilddateien - PCX, BMP, TGA, oder DDS - gespeichert und können mit Malprogrammen wie Gimp, PaintShop Pro® oder Adobe Photoshop® erstellt werden. TGA- oder DDS-Sprites können einen Alpha-Kanal enthalten, der jedem einzelnen Pixel einen Transparenzwert zuordnet. DDS-Dateien können zugunsten besserer Qualität und schnelleren Renderns mehrere Mipmapsn enthalten. Sprit-Entities werden schneller gerendert als Map oder Modellentities und lassen sich für Explosionen, Lichter, Flammen, Bäume, Gras oder dergleichen verwenden. PCX-, BMP- oder TGA-Sprites können animiert sein. DDS-Sprites können Mipmaps enthalten, die für bessere Qualität und schnelleres Rendern sorgen. Sprite-Entities werden schneller gerendert als Map- oder Modellentities. Sie können für Explosionen, Lichter, Flammen, Gras usw. benutzt werden. A8 Endet der Dateiname des Sprites auf "_x2" oder "_x3", wird es in Form von 2 bzw. 3 gekreutzen Flächen gerendert. Dies ist zum Simmulieren von Vegetation sehr nützlich. Ein Beispiel finden Sie im Demo infinite_terrain.c. Sind die Winkel eines Sprites auf Null, wird es aufrecht stehen und
sich horizontal der Kamera zuwenden. Ist sein pan-
oder tilt-Winkel
ungleich Null, wird der Sprite im seinen Winkeln gemäß im Raum der
Welt ausgerichtet. Vier kreuzweise ausgerichtete Sprites lassen sich
zur Darstellung von Pflanzen oder Bäumen plazieren. Sind pan und tilt beide
0, der roll-Winkel jedoch ungleich Null, wird sich
der Sprite der Kamera in zwei Richtungen zuwenden. Für kugelförimge
Objekte wie
Feuerbälle oder Explosionen ist dies sehr nützlich. Für ein animiertes
Sprite in den Formaten PCX, BMP, oder TGA (DDS unterstützte in A7) keine Animation) setzen
Sie einfach die einzelnen Animationsphasen nebeneinander wie bei einem
horizontalen Filmstreifen. Geben Sie die Anzahl der Phasen nach einem
'+' am Ende des Dateinamens an, wie zum Beispiel explo+11.tga: |
Eine Map-Entity ist einfach ein kleiner Level, der in einer externen WMB-Datei gespeichert ist. Map-Entities werden für die Teile im Level gebraucht, die sich als Ganzes bewegen, wie z.B. Türen, Plattformen, Zugbrücken oder Fahrzeuge. Da sie nichts anderes als kleine, kompilierte Maps sind, lassen sie sich mit WED erstellen. Beispielsweise können Sie jedes Prefab (Fertigteil) in eine solche Map-Entity umwandeln, indem Sie sie in WED öffen, ein BUILD durchführen und die sich ergebende WMB-Datei in Ihr gegenwärtiges Levelverzeichnis kopieren. Sie finden jede Menge vorbereiteter Türen, Möbel, Fahrzeuge und ähnliches in den Prefab-Unterverzeichnissen. Die Texturen und Shadow-Maps des Levels oder von Map Entities werden bereits beim Laden im Texturspeicher der Videokarte abgelegt, um den Spielablauf flüssig zu halten. Bei allen anderen Entities belegen die Texturen erst dann Speicherplatz, wenn die Entity sichtbar ist. Auch Modelle, Sprites oder Terrain werden als Teil einer Map-Entity mit in das Level gesetzt, in welches die Map-Entity eingefügt wird. Auf diese Weise können Entity-Gruppen definiert und miteinander als Map-Entities kompiliert werden. Durchlässige (passable), rechteckige, nichtrotierte Map-Entitities werden von den Template-Skripten als Wasser-Blöcke verwendet, in denen Actors waten, schwimmen, oder tauchen können. |
Ein Terrain ist ein rechteckiges Gitter von Höhenwerten mit einer oder mehren darüber gespannten Texturen. Es ist in einer externen HMP-Datei gespeichert. Terrain kann aus von Terrain-Generatoren produzierten BMP- oder PCX-Bitmaps in MED importiert und bearbeitet werden. Terrain ist 'fest' - es kann nicht animiert, gedreht, verschoben oder skaliert werden; allerdings kann es unter bestimmten Umständen deformiert werden. Die Terrain-Textur wird senkrecht projiziert, daher sieht die Textur an steilen Steigungen 'gedehnt' aus. Aufgrund der enormen Grösse eines Terrains reicht es nicht, eine normale Textur darauf zu mappen. Auch bei der empfohlenen Textur-Maximalgrösse von 2048x2048 Pixeln sähe das Terrain aus der Nähe unscharf aus. Die Lösung ist eine kleine Detail-Textur, die eine hochauflösende Sand-, Stein-, oder Grassstruktur über die erste Textur blendet. Hat ein Terrain eine zweite Skin, wird diese automatisch für Detailtexturen verwendet. Eine Erweiterung dieses Konzepts ist das Verwenden vielfältiger Detailtexturen zum stellenweisen Mappen von Steinen, Gras, Pfaden etc auf verschiedene Teile des Terrains. Das Material-Template mtlFX.c benutzt einen Effekt, um eine willkürliche Anzahl von Texturen in das Terrein einzublenden. Jede Textur muß eine Blend-Maske in ihrem Alphakanal haben. Um das Template zu benutzen, inkludieren Sie mtlFX.c in Ihr Skript und weisen die Aktion fx_terraintex oder das Material mtl_terraintex Ihrem Terrain zu. Durchlässige (passable) Terrains werden von den Template-Skripten für für Wasseroberflächen, in denen Actors waten, schwimmen oder tauchen können, verwendet. Mithilfe der oben erwähnten Material-Effects-Bibliothek lassen sich Wasserterrain reflektierende Wasserflächen mit Wellenbewegung zuweisen. Die Engine unterstützt zwei Arten von Terrain: in einem Stück (unchunked) oder parzelliert (chunked). Per Default ist Terrain parzelliert, es sei denn die Variable terrain_chunk ist auf 0 gesetzt oder der Dateiname der Terrain endet auf '_n' (z. B. "nonchunked_n.hmp") bestimmt. Unparzelliertes Terrain wird genau wie ein Modell gerendert und darf die Größe von 128x128 Vertices nicht überschreiten. C Parzelliertes Terrain wird von der Engine in quadratische Parzellen, die in einem Speicher-Cache gespeichert werden aufgeteilt. Sie werden separat geclippt wenn sie sich außerhalb des View-Frustrums befinden und P in verschiedenen Auflösungs-Schritten je nach Abstand zur Kamera und in Abhängigkeit der Einstellung von terrain_lod gerendert. Diese Methode ermöglicht viel schnelleres Terrain-Rendering und theoretisch eine unbegrenzte Größe von Terrain. Der kleine Haken dabei ist, daß sich parzelliertes Terrain nicht für Wasseryphysik benutzen läßt. |
Für den Fall, dass Sie sich nicht sicher sind, welche Art von Entity Sie für einen bestimmten Zweck verwenden sollen, hier eine Liste der Unterschiede:
Entity-Typ | Modell | Sprite | Map | Unchunked Terrain* | Chunked Terrain* |
Meist verwendet für | Actors, Fahrzeuge | Pflanzen, Effekte, Dekorationen | Gebäude, Plattformen, Türen, Züge | Aussen-Landschaften | Aussen-Landschaften |
Import-Format | 3DS, X, OBJ, ASE, MDL, MD2 | BMP, PCX, TGA, DDS | MAP, WMP | BMP, PCX, RAW, HMP | BMP, PCX, RAW, HMP |
Erstellt mit | MED oder externer Modell-Editor | Malprogramm | Map-Editor (WED) | MED oder externer Terrain-Editor | MED oder externer Terrain-Editor |
Polygone | ~10000 | 1 | ~1000 | ~10000 | ~100000 |
Größe | Klein | Klein | Mittel | Groß | Groß |
Animation | Gestalt, Skelett, Textur, Shader* | Textur, Shader* | Textur, Shader* | Shader*, Deformation, Wasserphysik | Shader*, Deformation |
Kollisionsform | Bounding Box, Ellipsoid, Polygonal | Bounding Box, Ellipsoid | Polygonal | Polygonal | Polygonal |
Bewegung | Bewegen, Rotieren, Skalieren | Bewegen, Rotieren, Skalieren | Bewegen, Rotieren | Keine | Keine |
Schattierung | PRV, Gouraud, dynamische Schatten* | PRV | PRV, statische Schatten | Gouraud, statische Schatten* | Gouraud, statische Schatten* |
Transparenz | Alphakanal, Transluzenz, Overlay | Alphakanal, Transluzenz, Overlay | Transluzenz, Overlay |
Transluzenz | Transluzenz |
* Nicht in allen Editionen unterstützt.
Sie können ein und dasselbe Objekt entweder als Entity (oder als Map-Entity nach dem Kompilieren) plazieren oder es als Block
oder Prefab (vorfabriziertes Fertigteil) in Ihr Level importieren. Soll
das Objekt sich bewegen
oder transparent
sein,
haben Sie keine Wahl: Es muss eine Entity sein. Andernfalls gibt
es einige Pros und Contras, die auf der Tatsache basieren, dass Blocks
oder Prefabs aktiv den Bsp-Tree beinflussen, während dieser sich
wiederum auf Map-Entities
auswirkt...
Map-Entities oder Prefabs |
||
Entities | Prefabs | |
Platzierung | + Object/Add Map/Model/Terrain/Sprite | + Object/Add Prefab, File/Import n |
Renderzeit (falls sichtbar)) | + Schneller, wenn komplex | + Schneller, wenn simpel |
Renderzeit (falls nicht sichtbar) | + Schneller | - Langsamer |
BUILD-Zeit | + Kein Einfluß | - Langsamer (Geometriebeschränkungen) |
Transparenz | + Ja | + Nein |
Licht und statische Schatten | - Eigene Lichter, Schatten auf sich selbst | - Licht- und Schattenwurf im Level |
Bewegungsmöglichkeit | + Kann sich bewegen | - Fixiert |
Aktionen | + Ja | - Nein |
Verwenden Sie also LOD für sämtliche Modelle, die aus mehr als 500.. 1000 Polygonen bestehen und mehrfach in verschiedenen abständen in ihrem Level existieren. Es hat nicht viel Sinn LOD für Modelle von weniger als 100 Polygonen zu benutzen, denn das ergäbe keinen merklichen Unterschied in der Rendergeschwindigkeit.
Mit der P Pro-Edition können Sie den LOD Manager von MED zum automatischen Generieren von LODs für Modelle benutzen. Terrain-LOD wird von der Pro-Edition automatisch über die Variable terrain_lod gehandhabt. Alternativ können Sie bei Entities niedrigerer Versionen auch manuell Modelle verschiedener Auflösungen erstellen. Sie werden von der Engine in Abhängigkeit ihres Abstands zur Kamera umgeschaltet. Wenn ein Entity-Dateiname mit "_0" endet, werden ähnliche Entity-Dateien, die mit "_1", "_2", oder "_3" enden, automatisch für die Darstellung mit geringeren Details benutzt (z.B. für "house_0.wmb" erwartet die Engine "house_1.wmb", "house_2.wmb", "house_3.wmb" als LOD-Dateien).
A7 Dieselben LOD-Schritte sind auch für Material-Effekte (material effects) und Shader (shaders) verfügbar. Heißt eine Effekt-Technik "lod0", "lod1", "lod2", oder "lod3" wird sie beim entsprechenden LOD-Level gerendert, ganz gleich, ob eine LOD-Entity vorhanden ist oder nicht. Auf diese Weiselassen sich verschiedene Effekte unabhängig vom Abstand der Entiy rendern. Geben Sie der am meisten zeitraubenden Technik den Namen lod0 und verwenden Sie lod1, lod2, und lod3 für einfachere und schnellere Effekte.
Die LOD-Distanzen lassen sich per Skript über camera.clip_far und d3d_lodfactor einstellen. Mit den voreingestellen LOD-Faktoren wird die Entity ab einer Distanz von 1/8 von clip_far mit der LOD-Stufe 1 dargestellt, ab ¼ von clip_far mit Stufe 2 und mit der 3. Stufe ab der halben clip_far-Distanz. Um ständiges Wechseln verschiedener LOD-Stufen bei bestimmten Distanzen zu verhindern, wechseln die Level erst bei Überschreiten eines Hysteresewerts von 15%. Befindet sich die Entity außerhalb der clip_far-Distanz, wird sie überhaupt nicht dargestellt. LOD wird für Chunked Terrain nicht unterstützt.
Für eine korrekte Animation und Beleuchtung müssen alle LOD-Dateinen von derselben Sorte sein, sowie dieselbe Größe und Ursprungsposition, Farbtiefe und Transparenz haben. So darf sich beispielsweise ein animiertes Modell nicht in ein Sprite verwandeln. Die Anzahl und Farbtiefe von Skins, die Anzahl der Frames und die Frame-Namen müssen bein sämtlichen LOD-Dateien identisch sein. Wird eine LOD-Datei nicht gefunden, wird die Entity auf dieser LOD-Distanz überhaupt nicht dargestellt. So kann man aus verschiedenen Teilen zusammengesetzte Unter-Entities ab einer bestimmten Distanz unterdrücken. Hat ein Model mehrere LOD-Stufen, wird sein Schatten aus der nächsthöheren der jeweils dargestellten Stufe berechnet (einstellbar per shadow_lod). Auf diese Weise können dynamische Schatten deutlich schneller gerendert werden. Ist das Modell weiter als 50% der clip_far Distanz entfernt, wird überhaupt kein Schatten mehr gerendert.
Nichttransparente Modell-Entities können dynamische Schatten werfen, wenn ihr SHADOW Flag per WED oder per Skript gesetzt ist. Anhängig von der Einstellung von shadow_stencil generiert die Engine dynamische Decal-Schatten, Stencil-Schatten oder PSSM-Schatten.
Allgemeiner Decal-Schatten | Individueller Decal-Schatten | Stencil Eigenschatten |
Stencil ohne Eigenschatten | Geglätteter Stencil-Schatten | PSSM Eigenschatten |
Falls sich die Entity jedoch nicht bewegt - wie etwa ein Baum - kann es von Vorteil sein, sie einen statischen Schatten werfen zu lassen. Statische Schatten haben einen sanfteren Helligkeitsverlauf, werden schneller gerendert und werden von allen Editionen unterstützt. Erstellen Sie einen Block in der ungefähren Größe und Form der Entity, platzieren Sie ihn auf die Entity-Position, setzen Sie sein Detail-Flag und weisen Sie allen Seiten den Texturmodus None zu, um ihn unsichtbar zu machen. Der Block wird dann einen statischen Schatten auf den Boden werfen und als Hindernis dienen, aber nicht sichtbar sein. Bei der Entity kann das PASSABLE-Flag für schnellere Kollisionserkennung gesetzt werden.
Entities können 3 Arten von Transparenz haben: Overlay-Transparenz, Alpha-Transparenz (Transluzenz) und Alphakanal-Transparenz.
Overlay-Transparenz bedeutet, dass alle komplett schwarzen Texturpixel und sämtliche Pixel unterhalb einer bestimmten Transparenzschwelle vollkommen transparent, also unsichtbar sind. Alle anderen Pixel sind absolut sichtbar, es gibt keine Zwischenstufen. Sprites und Partikel sind, wenn ihre Textur keinen Alphakanal hat, automatisch overlay-transparent .
Alpha-Transparenz bedeutet eine gleichmäßige Transparenz über die gesamte Entity-Textur und wird durch Setzen des Flags TRANSLUCENT aktiviert. sie wird oft zum sanften Ein- und Ausblenden von Entities verwender.
Alphakanal-Transparenz bedeutet, daß jeder Texturpixel seinen eigenen und individuellen Transparenwert hat. Diese Art von Transparenz ist normalerweise dann aktiv, wen n die Entitytextur einen Alphakanal enthält. Das ist bei transparenten Texturformaten wie TGA 32 bit or DDS DXT2..5 der Fall. Darf eine Entity nicht transparent sein obwohl ihre Skin einen Alphakanal enthält - beispielsweise wenn der Alphakanal in einem Shader für eine spiegelnde Map benutzt wird - kann man das Flag PASS_SOLID verwenden.
Alle drei Transparenztypen lassen sich kombinieren, allerdings hat das Konsequenzen für ihr Rendern. Wenn Sie beispielsweise Overlay- und Alpha-Transparenz kombinieren, wird, wenn der Alpha-Wert der Entity unter die Transparenzschwelle fällt, die gesamte Textur sichtbar (d3d_alpharef).
Eine logische Konsequenz von durchsichtigen oder alphakanal-transparenten Objekten besteht darin, dass Sie andere Objekte durch sie hindurchsehen können. Das klingt zwar trivial, bedeutet aber, dass transparente oder durchscheinende Entities über allen nicht-durchsichtigen Entities gerendert werden (siehe Renden) und nicht in den Z-Buffer der 3D-Karte schreiben können. Dadurch ist ihre Tiefensortierung nicht pixelgenau, sondern nur objekt-genau. Polygone oder andere Teile desselben Objekts verdecken einander nicht. Dies kann, wenn Dreiecke transparenter Modelle sich überlappen, zu sichtbaren Sortierfehlern auf dem Bildschirm führen. Die Fehler sind normalerweise kaum zu bemerken, manchmal aber sehr offensichtlich - besonders dann, wenn der Alphakanal fast undurchsichtig ist. Falls Sie solche Sortierfehler sehen, wissen Sie, dass Sie hier Transparenz an falscher Stelle eingesetzt haben und dies auch selbst korrigieren müssen - Beschwerden beim Support oder auf dem Gamestudio-Forum helfen nicht. Jeder Spielentwickler muss einfach beachten, wie 3D-Karten mit Transparenz umgehen.
Die übliche Lösung, solchen Sortierfehlern vorzubeugen liegt im Aufteilen einer transparenten Entity in mehrere Unterentities, die dann individuell tiefensortiert werden. Sie können auch eine Entity verwenden, die aus transparenten und nicht-transparenten Gruppen besteht. Abhängig von Typ des Spiels kann auch Setzen von d3d_entsort auf den Wert 2 Sortierprobleme lösen.► Aktuelle Version Online