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;