Layered Terrain Surface Representation

From Bohemia Interactive Community
Revision as of 13:46, 22 January 2007 by Ceeeb (talk | contribs) (Game Engine Notes)
Jump to navigation Jump to search

Terrain surfaces for the whole world are represented by a pair of textures covering the whole world: Satellite Map and Layer Map. PNG format is used for both textures, both textures are split into segments when imported to Visitor and Layer Map is converted to Layer Mask during the process. Each segment overlaps it's neighbours to allow terrain streaming. The Satellite Map provides basic colour information for displaying distant terrain. As terrain can be visable beyond the range that objects are, representations of objects such as trees, roads, ocean and buildings are all included on the satalite map. The Layer Map and Config defines which terrain type to display at close distances.

Note: The import process can be very time consuming because of the huge amount of data being processed. The full import of data for 20x20 km world with resolution 1 takes about 10 hours on a 2 GHz computer. The conversion is incremental, therefore if you edit only a small part of the maps, the next iteration is a lot faster, but it still can take about 1 hour (only launching Buldozer to check the results takes around 15 minutes). Be sure to tune your surfaces with small world first and once you are happy with the results, proceed with the large one.

Layer Legend

Legend is an image accompanied with a config, defining conversion from RGB to layers. Config defines which color represents what surface type. One surface type can be represented by multiple colors, which makes creating smooth blends between multiple surface type pairs possible. Only first line of the image is read, the rest is ignored and can be used for annotations.

There are few limitations imposed on the legend file - main being no color can exist twice in the image. The sample legend was created using gradient Rainbow in Photoshop, with added gradients to black and white on the ends using gradient between two colors.

Layer Legend

Config describing basic surfaces for this legend might look like this (the config is part of the layer config described below):

class Legend
  class Colors
    /// color names should correspond to surface layer names
Layer Map
Layer Map
Satellite Map

Layer map is edited as an RGB image. Each pixel of the map image is interpreted as follows:

  • best matching color in the Legend is found
  • based on nearest left and right basic surface corresponding surface blend is used

There is another config file describing the layer map. It defines what legend is used, and it also defines surface materials for basic surfaces. Surface materials used in one layer map need to have all parameters except the textures referenced identical. Textures used should not use SRGB color conversions, which implies _lco texture type should be used.

class Layers
  class Grass

  class Sand
    texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1)";

  class Rock
    texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1)";

  class Mud
    texture = "#(argb,8,8,3)color(0.5,0.5,0.5,1)";

class Legend
  // see above
Editing Layer Map and Satellite Map

Assume texture folder is defined as LayerTest\Data in the Visitor for given world. All source files are assume to be located in LayerTest\Source unless specified otherwise.


  • create a legend image
  • create a config layers.cfg defining surfaces and legend used
  • in Tools/Project Preferences decide on the satellite map segment size. The segments need to overlap slightly because of texture connecting - good overlap size is around 16 texels. Satellite map segment size is given as a multiple of basic landscape grid.
Example: Assume world size 10240 x 10240 m with 40 m grid (i.e. 256 x 256 grids) , satellite texture with resolution 7680 x 7680 (one landscape grid needs to be covered by a whole number of texels, therefore satellite texture size needs to be a multiple of world size in grids). We want to achieve segment size 512 x 512 texels, and given the 16 texel overlap wanted, one segment will cover 496 x 496 texels. Size of one texel is 10240 m /7680 (1.3333 m) in this case, 496 texels give around 661.33 m. With 40 m grid we get 661.33/40 = 16.5, which rounded down gives 16. (If the texture grid is different from the terrain grid, rounding down is not enough - we need to round down to the nearest multiple of the number of terrain grids in the texture grid. With terrain grid 10 and texture grid 40 the satellite segment size needs to be a multiple of 4.
Example2 : SaraLite uses 11x11 segments. Each segment is 512x512 pixels and overlaps it's neighbours by 32 pixels. The total layer maps cover 5312x5312 pixels. The terrain covers 10240 x 10240m in 512x512 ~20 meter cells. The texture grid appears to be made up of 256x256 ~40m cells. This working example appears to break the rules above.

Editing cycle: (editing is usually done in Photoshop with Buldozer not running)

  • edit satellite map in Photoshop (file Satellite-map_lco.png). Note: you need to use _lco or _draftlco as a texture type.
  • edit layer map mask in Photoshop (file Layer-map_lco.png). Note: you need to use _lco or _draftlco as a texture type.
  • run Tools / Import Satellite + Mask, select Satellite-map_lco.png, Layers.cfg, Layer-map_lco.png files in the file browser
  • run Buldozer to check the result

Each terrain type is represented at close distance by a colour only (CO) texture and a normal map (NO*). On SaraLite, each 1024x1024 pixel detail covers about 4m. Each pixel of the layer mask covers about 2m.

Terrain types also have an associated MCO texture. This is multiplied with the satellite map to provide middle distance details. On SaraLite, each 1024x1024 MCO texture covers about 40m. They appear to applied on a transformed grid.

Game Engine Notes

The information about the layer map above relates to tool use rather than the ArmA game engine. For game use each segment of the Layer map uses its own pallete that is unrelated to the Layer Legend mentioned above. Each terrain type within a segment uses a colour based upon the order in which the terrain types are defined in the config. Colours are used in the following order : Black (000000), Red (FF0000), Green (00FF00), Blue (0000FF). It is interesting to note SaraLite uses a maximum of 4 terrain types in any given segment. This may be an engine limitation. All 4 terrain types can be blended together within one detail square.

There are several RVMAT configs for each segment, each defining a PixelShaderID. There exist one RVMAT config for each combination of terrain types within each texture grid(?) within that segment. The PixelShaderIDs are named using this manner : first terrain type = 1, 2nd = 2, 3rd = 4, 4th = 8. (technical term?). For example: PixelShaderID = "Terrain15" contains all 4 terrains, "Terrain6" contains the 2nd and 3rd terrains.

Unknown Information

How the ground clutters are placed.