[TUT] Winkeleinstellungen für dynamisches Terrain

User avatar
derSchreiner
GIANTS Software | QA Analyst
Posts: 3728
Joined: Fri Jan 01, 2010 8:02 pm
Location: Nürnberg, Franken

[TUT] Winkeleinstellungen für dynamisches Terrain

Post by derSchreiner »

Stegei wrote: Hier die Schritte um mehr Winkel zuzulassen:

Als Beispiel verwende ich die doppelte Anzahl Abstufung als in der Standard Map.
Das heisst es werden 16 statt 8 Winkel dargestellt. Dazu werden 3 statt 2 Channels in der Density Map benötigt.
Es sind aber grundsätzlich beliebig viele Winkel möglich, auch nicht Power of Two Werte. Es macht aber grundsätzlich Sinn Power of Two Werte zu verwenden, damit die Anzahl Channels optimal ausgenutzt werden, und auch immer die 90 Grad Abstufungen perfekt dargestellt werden können.
  1. numDensityMapChannels:
    In der Map den DetailLayer "terrainDetail" suchen und den Wert numDensityMapChannels erhöhen.
    Die Typen (Pflug, Grubber, etc.) benötigen 5 Channels, die restlichen werden für den Winkel verwendet.
    D.h. total = 5+Winkelchannels. In unserem Beispiel also neu 8 statt 7.
  2. combinedValuesChannels:
    In der Map den DetailLayer "terrainDetail" suchen und den Wert combinedValuesChannels anpassen.
    Dies bestimmt welche Werte dem Shader übergeben werden müssen. Dazu muss man die zweitletzte Zahl (;5 2 1) anpassen. Dies sind die Anzahl Winkelchannels.
    Also in unserem Beispiel neu (;5 3 1)
  3. Script Anpassen (terrainDetailAngleNumChannels, terrainDetailAngleMaxValue):
    Das Script muss ebenfalls wissen wie viele Winkel und Winkelchannels verwendet werden sollen.
    Dazu muss man im Missions/Map Script der Modmap (z.b. SampleModMap.lua) die Funktion loadMap01Finished suchen und Start folgenden Code einfügen:

    Code: Select all

    self.terrainDetailAngleNumChannels = 3; -- durch die gewünschte Anzahl Channels ersetzen
    self.terrainDetailAngleMaxValue = bitShiftLeft(1, self.terrainDetailAngleNumChannels) - 1;
    
    Falls der Code nicht direkt SampleModMap entspricht, muss dieser Code in die Callback Funktion eingefügt werden, welche nach dem laden des map i3ds aufgerufen wird.
  4. goundShader.xml:
    Der Ground Shader muss ebenfalls die Anzahl Winkel kennen.
    Dazu öffnet man goundShader.xml (zu findem unter <map>/shaders, wobei <maps> der Ordner ist, wo das Mod Map i3d ist) mit einem Texteditor und sucht die Zeile

    Code: Select all

    float angle = ceil(globals.blendMap2.y*3-0.0001)/4*3.14159;
    Dazu die 4 mit dem Wert von terrainDetailAngleMaxValue+1 und die 3 mit terrainDetailAngleMaxValue ersetzen.
    In unserem Beispiel ist das also (2^3)=8 und ((2^3)-1)=7 (bei 4 Channels wären es 16 und 15)
    Der neue Code sieht also so aus:

    Code: Select all

    float angle = ceil(globals.blendMap2.y*7-0.0001)/8*3.14159;
Was hat das Erhöhen der Anzahl Winkel für einen Einfluss auf die Performance?

Durch das Erhöhen der Anzahl Channels in der Density Map, wird mehr Speicher benötigt.
Dies hat v.a. einen Einfluss auf die initiale Übertragungsgeschwindigkeit im Multiplayer da mehr Daten versendet werden müssen.
Zudem sind die laufenden Packete für die Bodenbearbeitung etwas grösser, da mehr Speicher benötigt wird um den gewünschten Winkel darzustellen, dies ist allerdings nur sehr minimal.
Da mehr Speicher angefasst wird für die Berechnungen auf der CPU, werden diese etwas mehr verzögert, zudem sind die Berechnungen etwas komplizierter werden.
Konkret werden die Bodenbearbeitungsoperationen vermutlich ca. 5% länger dauern. Da dies aber nur ein sehr kleiner Teil aller Berechnungen im Spiel ist, wird der Einfluss wohl unter 1% liegen.
Auf die GPU hat die Änderung keinen Einfluss da es keine Rolle Spiel ob mal 3 oder mal 7 (und /4 oder /8) gerechnet wird und die restlichen Daten und Berechnungen von der Anzahl Channel unabhängig ist.
Grüße derSchreiner

How to report a BUG -> German / English | How to post a log file | How to upload images