Low poly

로우폴리

A style that deliberately simplifies a form into a handful of triangles and shades each face flat, showing off a faceted, gem-like look on purpose.

Also known as: Low-poly art styleFaceted style
···
html
<span class="lp-cap">low poly · flat shading + vertex color</span>
css
.lp-cap{position:absolute;left:0;right:0;bottom:5%;text-align:center;font-size:clamp(9px,2.4vmin,12px);color:#dfe3ffcc}
js
import * as THREE from 'three';
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
document.body.appendChild(renderer.domElement);
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x0d0d16);
const camera = new THREE.PerspectiveCamera(42, 1, 0.1, 100);
camera.position.set(0, 0.6, 5.6);

let geo = new THREE.IcosahedronGeometry(1.5, 1);
geo = geo.toNonIndexed();
const pos = geo.attributes.position;
const colors = new Float32Array(pos.count * 3);
const c = new THREE.Color();
for (let f = 0; f < pos.count; f += 3) {
  c.setHSL(0.52 + Math.random() * 0.22, 0.65, 0.42 + Math.random() * 0.22);
  for (let v = 0; v < 3; v++) colors.set([c.r, c.g, c.b], (f + v) * 3);
}
geo.setAttribute('color', new THREE.BufferAttribute(colors, 3));
const mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({ vertexColors: true, flatShading: true, roughness: 0.55, metalness: 0.05 }));
scene.add(mesh);
const key = new THREE.DirectionalLight(0xffffff, 1.8); key.position.set(3, 4, 5); scene.add(key);
scene.add(new THREE.AmbientLight(0xffffff, 0.55));

function resize() { renderer.setSize(innerWidth, innerHeight); camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix(); }
addEventListener('resize', resize); resize();
renderer.setAnimationLoop((t) => {
  mesh.rotation.y = t * 0.00022;
  mesh.rotation.x = Math.sin(t * 0.00014) * 0.25;
  renderer.render(scene, camera);
});

Every model loses detail as its polygon count drops. Low poly doesn’t hide that loss — it turns it into an aesthetic. Instead of smoothing the facets over so they look mushy (smooth shading), each triangle gets shaded flat (flat shading), and “being faceted” becomes a design choice in itself.

The style is practical too: fewer polygons means a lighter real-time render, and vertex colors or a handful of flat colors alone — no textures required — can still look finished, which is why it shows up so often in mobile games and early indie titles. At the same time, it reads like illustration: the world reinterpreted as simple geometry.

In Blender or C4D, this look gets faked with the Decimate modifier plus flat shading turned on, or built deliberately as faceted shapes from the start. Generating a large low-poly terrain usually pairs this with procedural generation — a plane whose height gets jittered by noise.

When to use

Reach for it when you need a light real-time render, or you deliberately want an illustrative, stylized look.