This is an old revision of the document!


Billboard

A billboard controls proxy objects of a basis mesh instance (source object).

The billboard component is a mesh itself, into which proxies are merged. Much faster rendering is possible if proxy meshes are merge into one mesh, instead of rendering each mesh.

We typically use this technique for grass or trees. It is not suitable for animated meshes.

Using a grass billboard

In this example we will display grass on multiplied planes inside of the billboard component. After applying the TGorillaGrassMaterial we are able to render different textures onto those planes and to manipulate vertices.

The result should be a varying grass landscape with waving grass.

Form1.pas
procedure TForm1.FormCreate(Sender: TObject);
var LBillboard : TPlane;
    LPoolE : TGorillaBitmapPoolEntry;
    LGrassMat : TGorillaGrassMaterialSource;
    LAlg : TGorillaBillboardRectFilling;
begin
  // creating the source object - here a plane
  LBillboard := TPlane.Create(fGorilla);
  LBillboard.Scale.Point := Point3D(4, 4, 4);
 
  // creating the grass material source
  FGrassMat := TGorillaGrassMaterialSource.Create(FGorilla);
  FGrassMat.Parent := FGorilla;
 
  // now we load a pool of grass textures, the material shader
  // randomly chooses from
  with FGrassMat do
  begin
    LPoolE := Bitmaps.Add() as TGorillaBitmapPoolEntry;
    LPoolE.Bitmap.LoadFromFile('grass1.png');
 
    LPoolE := Bitmaps.Add() as TGorillaBitmapPoolEntry;
    LPoolE.Bitmap.LoadFromFile('grass2.png');
 
    LPoolE := Bitmaps.Add() as TGorillaBitmapPoolEntry;
    LPoolE.Bitmap.LoadFromFile('grass3.png');
 
    LPoolE := Bitmaps.Add() as TGorillaBitmapPoolEntry;
    LPoolE.Bitmap.LoadFromFile('grass4.png');
  end;  
 
  // creating the billboard control
  FGrass := TGorillaBillboard.Create(FGorilla);
  FGrass .Parent := FGorilla;
  FGrass.SourceObject := LBillboard;
  FGrass.MaterialSource := LGrassMat;
  FGrass.SetSize(GORILLA_BILLBOARD_SIZE, GORILLA_BILLBOARD_SIZE, GORILLA_BILLBOARD_SIZE);
 
  // create an individual filling algorithm to multiply the grass planes
  LAlg := TGorillaBillboardRectFilling.Create(FGrass);
  try
    FGrass.Fill(LAlg, true);
  finally
    FreeAndNil(LAlg);
  end;