Terrain Material (TGorillaTerrainMaterialSource)

The TGorillaTerrainMaterialSource is inherited from the TGorillaDefaultMaterialSource, supports multiple lights and enables texturing by height information: GORILLA_GLSL_DEFINE_TERRAINMAP

It works by defining a height range and which texture to use. To allow texture overlapping, you can configure transition for each level.

The material provides a texture bitmap pool (TCollection) where you can simply add your height levels and the texture to be used.

We create a height level by Bitmaps.Add() function and retrieve a new TGorillaTerrainBitmap instance with a few properties to be set:

Property Notice
DisplayName A required texture name.
MinHeight The lower limit value, depending on the untransformed mesh vertex position.
MaxHeight The upper limit value, depending on the untransformed mesh vertex position.
LowTransition A transition value at the lower limit for blending transitions between textures.
HighTransition A transition value at the upper limit for blending transitions between textures.
Tiling A texture tiling for multiplying the specific texture.
Bitmap Loading the texture data itself.
var LTerrMat : TGorillaTerrainMaterialSource;
    LTerrBmp : TGorillaTerrainBitmap;
 
[...]
 
  LTerrMat := TGorillaTerrainMaterialSource.Create(fTerrain);
  LTerrMat.Parent := FTerrain;
  with LTerrMat do
  begin
    // height level 1
    LTerrBmp := Bitmaps.Add() as TGorillaTerrainBitmap;
    LTerrBmp.DisplayName := 'TerrainTexture0';
    LTerrBmp.MinHeight := +0.1;
    LTerrBmp.MaxHeight := -0.5;
    LTerrBmp.LowTransition := 0.25;
    LTerrBmp.HighTransition := 0.25;
    LTerrBmp.Tiling := TPointF.Create(32, 32);
    LTerrBmp.Bitmap.LoadFromFile('terrain-1.jpg');
 
    // height level 2
    LTerrBmp:= Bitmaps.Add() as TGorillaTerrainBitmap;
    LTerrBmp.DisplayName := 'TerrainTexture1';
    LTerrBmp.MinHeight := -0.5;
    LTerrBmp.MaxHeight := -1.0;
    LTerrBmp.LowTransition := 0.25;
    LTerrBmp.HighTransition := 0.25;
    LTerrBmp.Tiling := TPointF.Create(32, 32);
    LTerrBmp.Bitmap.LoadFromFile('terrain-2.jpg');
 
    // height level 3
    LTerrBmp:= Bitmaps.Add() as TGorillaTerrainBitmap;
    LTerrBmp.DisplayName := 'TerrainTexture2';
    LTerrBmp.MinHeight := -1.0;
    LTerrBmp.MaxHeight := -2.0;
    LTerrBmp.LowTransition := 0.25;
    LTerrBmp.HighTransition := 0.25;
    LTerrBmp.Tiling := TPointF.Create(32, 32);
    LTerrBmp.Bitmap.LoadFromFile('terrain-3.jpg');
 
    // height level 4
    LTerrBmp:= Bitmaps.Add() as TGorillaTerrainBitmap;
    LTerrBmp.DisplayName := 'TerrainTexture3';
    LTerrBmp.MinHeight := -2.0;
    LTerrBmp.MaxHeight := -FTerrain.HeightScale - 0.1;
    LTerrBmp.LowTransition := 0.25;
    LTerrBmp.HighTransition := 0.25;
    LTerrBmp.Tiling := TPointF.Create(32, 32);
    LTerrBmp.Bitmap.LoadFromFile('terrain-4.jpg');
  end;

Lower and upper limits

The texture selection in the material shader depends on the untransformed mesh vertex position on y-axis (GLSL: “vars.v_VertPos.y”). So MinHeight and MaxHeight values should range between 0.0 and -FTerrain.HeightScale including a tolerance of +/-0.1.

For example:

1) Dividing a terrain in 3 equal height-levels at a terrain height scale of 1.0 means:

Level MinHeight MaxHeight
Level 1 0.0 [+ 0.1] -0.33
Level 2 -0.33 -0.66
Level 3 -0.66 -1.0 [-0.1]

2) Dividing a terrain in 3 equal height-levels at a terrain height scale of 2.0 means:

Level MinHeight MaxHeight
Level 1 0.0 [+ 0.1] -0.66
Level 2 -0.66 -1.33
Level 3 -1.33 -2.0 [-0.1]

Lower and upper transition

Transition values are useful for overlapping / blending textures to simulate a more realistic terrain texture. Like the lower and upper limit values, transitions also depend on the untransformed mesh vertex position. So LowTransition and HighTransition values should range between 0.0 and -FTerrain.HeightScale, too.