삼점 조명

Three-point lighting

주광(key)·보조광(fill)·역광(back) 세 개의 조명을 배치해 피사체를 입체적으로, 배경과 분리되어 보이게 만드는 기본 조명 셋업.

다른 이름: Key/fill/back lightKey-fill-rim setup
···
html
<div class="hud">
  <span class="tag key" id="tagKey">KEY</span>
  <span class="tag fill" id="tagFill">FILL</span>
  <span class="tag back" id="tagBack">BACK</span>
</div>
css
.hud{position:absolute;left:5%;top:5%;display:flex;gap:6px}
.tag{font:800 10px ui-monospace,monospace;padding:3px 8px;border-radius:20px;color:#fff;
  background:rgba(255,255,255,.08);opacity:.25;transition:opacity .4s,background .4s;letter-spacing:.04em}
.tag.on{opacity:1}
.tag.key.on{background:#c98a2c}
.tag.fill.on{background:#3d5fbf}
.tag.back.on{background:#6a6a8a}
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(0x0a0a10);

const camera = new THREE.PerspectiveCamera(42, 1, 0.1, 100);
camera.position.set(0, 0.3, 4.6);
camera.lookAt(0, 0.1, 0);

const backdrop = new THREE.Mesh(
  new THREE.PlaneGeometry(8, 5),
  new THREE.MeshStandardMaterial({ color: 0x111118, roughness: 1 })
);
backdrop.position.set(0, 0.5, -2);
scene.add(backdrop);

const head = new THREE.Mesh(
  new THREE.SphereGeometry(1, 48, 48),
  new THREE.MeshStandardMaterial({ color: 0xd9b98c, roughness: 0.6 })
);
scene.add(head);
const base = new THREE.Mesh(
  new THREE.CylinderGeometry(0.7, 0.9, 0.7, 32),
  new THREE.MeshStandardMaterial({ color: 0x2c2f3d, roughness: 0.7 })
);
base.position.set(0, -1.25, 0);
scene.add(base);

scene.add(new THREE.AmbientLight(0x404050, 0.25));
const key = new THREE.DirectionalLight(0xffcf8f, 0);
key.position.set(3, 3, 3);
scene.add(key);
const fill = new THREE.DirectionalLight(0x8fb3ff, 0);
fill.position.set(-3.5, 1, 2.5);
scene.add(fill);
const back = new THREE.DirectionalLight(0xe4e4ff, 0);
back.position.set(0, 3, -3.5);
scene.add(back);

const tagKey = document.getElementById('tagKey');
const tagFill = document.getElementById('tagFill');
const tagBack = document.getElementById('tagBack');

function resize() { renderer.setSize(innerWidth, innerHeight); camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix(); }
addEventListener('resize', resize); resize();

renderer.setAnimationLoop((t) => {
  const phase = Math.floor((t / 1600) % 4);
  const wantKey = phase !== 3;
  const wantFill = phase === 1 || phase === 2;
  const wantBack = phase === 2;
  key.intensity = THREE.MathUtils.lerp(key.intensity, wantKey ? 2.4 : 0, 0.12);
  fill.intensity = THREE.MathUtils.lerp(fill.intensity, wantFill ? 0.9 : 0, 0.12);
  back.intensity = THREE.MathUtils.lerp(back.intensity, wantBack ? 1.6 : 0, 0.12);
  tagKey.classList.toggle('on', wantKey);
  tagFill.classList.toggle('on', wantFill);
  tagBack.classList.toggle('on', wantBack);
  head.rotation.y = t * 0.0002;
  renderer.render(scene, camera);
});

주광(key light)은 가장 밝고 주된 광원으로, 보통 피사체의 45도 앞쪽 위에서 비춥니다. 그것만 쓰면 반대쪽에 짙은 그림자가 생기므로, 보조광(fill light)을 반대쪽에 더 약하게 둬서 그 그림자를 살짝 밝혀 디테일을 살립니다.

역광(back light, rim light)은 피사체 뒤·위에서 비춰 머리카락이나 어깨 윤곽을 따라 가느다란 밝은 테두리를 만듭니다. 이 테두리가 피사체를 배경에서 시각적으로 떼어내는 역할을 합니다 — 배경과 피사체 색이 비슷할 때 특히 중요합니다.

데모는 세 조명을 순서대로 켜갑니다: 주광만 있을 땐 한쪽이 짙게 어둡고, 보조광이 더해지면 그림자가 옅어지고, 역광까지 켜지면 윤곽선이 배경에서 살짝 떠오릅니다. 세 조명의 밝기 비율(보통 키:필이 2:1~4:1)을 조절하는 것이 조명 디자인의 핵심입니다.

언제 쓰나

인터뷰·제품·인물 촬영 어디서나 출발점으로 씁니다. 세 조명 비율을 바꾸면 로우키·하이키로도 확장됩니다.