FoliMesh

Bushes in Low-poly Style for Babylon.js

Low-poly bushes drop into Babylon.js as plain GLB: load them with ImportMeshAsync from @babylonjs/loaders, or LoadAssetContainerAsync plus instantiateModelsToScene when the same hedge is repeated dozens of times. Leaves are solid faceted geometry with flat shading, and colour lives in vertex colours (COLOR_0), so there is no alpha testing and no transparent overdraw on mobile GPUs. One material drives the whole set, so Bamboo, Hedge, Juniper and Raspberry batch cleanly, and thin instances render thousands of copies in one draw call per mesh.

Every bush ships with LOD0–LOD3, collision and a pivot at the base. Wire the levels with lod0.addLODLevel(30, lod1), addLODLevel(80, lod2), or pass null to hide distant shrubs; LOD0 stays in the few hundred to couple thousand triangle range. The invisible collision mesh feeds checkCollisions or a Havok PhysicsAggregate. Faceted undergrowth like this suits WebGL/WebGPU scenes, VR and strategy or city-builder projects.

Models
8
Levels of detail
LOD0 – LOD3
Formats
GLB · FBX · OBJ

About the Low-poly style

Low-poly vegetation is the cheapest style to render and to ship.

  • Flat shading: one normal per face gives the crisp faceted look; no normal maps.
  • Colour lives in vertex colours (glTF COLOR_0), so there are no textures, no UV work and almost no video memory.
  • Leaves are solid geometry, not alpha cards: no alpha testing and no transparent overdraw, which matters on mobile GPUs.
  • One material can be shared by every model in the scene, so trees batch and instance easily.
  • Typical budgets range from a few hundred to a couple of thousand triangles at LOD0.

A good fit for mobile, WebGL/WebGPU, VR, strategy, city builders and stylised indie games. In the engine, use a material that multiplies by vertex colour.

Using it in Babylon.js

Babylon.js loads GLB through the glTF loader in @babylonjs/loaders: ImportMeshAsync (or SceneLoader.ImportMeshAsync in older code), or LoadAssetContainerAsync when you need many copies via instantiateModelsToScene.

  • LOD: lod0.addLODLevel(30, lod1), addLODLevel(80, lod2) and so on; passing null as the mesh hides the object beyond that distance.
  • Thousands of trees: thin instances (thinInstanceAdd with matrices) render in one draw call per mesh; use regular createInstance when each tree needs its own picking or logic.
  • Leaves: glTF MASK maps to alpha-tested PBRMaterial (MATERIAL_ALPHATEST).
  • Collision mesh: set isVisible = false and use it with checkCollisions or Havok physics (PhysicsAggregate with a MESH shape).

Packs

Other categories

Same in other styles

Same for other engines