FoliMesh

Cacti & Succulents in Low-poly Style for three.js

Saguaro, Barrel Cactus, Prickly Pear, Agave and Aloe arrive as GLB with LOD0–LOD3, collision and a pivot at the base, so GLTFLoader from three/addons gives meshes you can hand straight to THREE.LOD with lod.addLevel(mesh, distance). Flat shading and vertex colors keep budgets between a few hundred and a couple of thousand triangles at LOD0 — no textures, no UV work.

Leaves are solid geometry, not alpha cards, so there is no alpha testing and no transparent overdraw on mobile GPUs. Color comes in COLOR_0, so use a material that multiplies by vertex color. Scatter Saguaro with InstancedMesh, mix Agave and Aloe variations with BatchedMesh, and pass the invisible collision mesh to Rapier or cannon-es. Works with WebGLRenderer and WebGPURenderer.

Models
5
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 three.js

In three.js, load GLB with GLTFLoader from three/addons; add DRACOLoader or KTX2Loader only if a file uses those extensions.

  • Distance LOD: THREE.LOD with lod.addLevel(mesh, distance) for LOD0–LOD3; it switches levels by camera distance every frame.
  • Forests: InstancedMesh draws thousands of copies in one draw call, and BatchedMesh mixes several tree variations. THREE.LOD does not apply per instance, so group instances by LOD per chunk yourself.
  • Leaves: glTF alphaMode MASK becomes material.alphaTest, and double-sided materials get side: THREE.DoubleSide automatically.
  • Collision mesh: keep it invisible and pass it to a physics library such as Rapier or cannon-es.

Works with both WebGLRenderer and WebGPURenderer.

Other categories

Same in other styles

Same for other engines