픽셀 아트

Pixel art

하나하나 눈에 보이는 사각 픽셀로 그리는 이미지 스타일. 초기 콘솔·아케이드 게임의 하드웨어 제약에서 나왔습니다.

다른 이름: 8-bit styleBitmap art
···
html
<div class="screen">
  <div class="stars"></div>
  <div class="sprite" id="sprite"></div>
  <div class="ground"></div>
  <span class="hud">SCORE 0120</span>
</div>
css
.screen{position:relative;width:min(90%,300px);aspect-ratio:1.5;overflow:hidden;background:#0d1524;
  border:2px solid #37507a;image-rendering:pixelated}
.stars{position:absolute;inset:0;
  background-image:radial-gradient(1.5px 1.5px at 20% 20%,#9fd,transparent),
    radial-gradient(1.5px 1.5px at 70% 40%,#9fd,transparent),
    radial-gradient(1.5px 1.5px at 40% 70%,#9fd,transparent),
    radial-gradient(1.5px 1.5px at 85% 75%,#9fd,transparent);opacity:.6}
.ground{position:absolute;left:0;right:0;bottom:0;height:18%;background:#274a2e;
  box-shadow:0 -3px 0 #3b6b45}
.sprite{position:absolute;left:38%;bottom:18%;width:7px;height:7px}
.hud{position:absolute;left:8px;top:6px;font:8px/1 "Courier New",monospace;color:#7bffb0;letter-spacing:1px}
js
function pixels(rows, unit, color) {
  const out = [];
  rows.forEach((row, y) => {
    for (let x = 0; x < row.length; x++) {
      if (row[x] === 'X') out.push((x * unit) + 'px ' + (y * unit) + 'px 0 ' + color);
      if (row[x] === 'O') out.push((x * unit) + 'px ' + (y * unit) + 'px 0 #0d1524');
    }
  });
  return out.join(',');
}
const frameA = ['.XXXXX.', 'XXXXXXX', 'XOXXXOX', 'XXXXXXX', '.XXXXX.', '..X.X..', '.X...X.'];
const frameB = ['.XXXXX.', 'XXXXXXX', 'XOXXXOX', 'XXXXXXX', '.XXXXX.', '.X...X.', 'X.....X'];
const sprite = document.getElementById('sprite');
const unit = 7;
let toggled = false;
let dir = 1;
function step() {
  sprite.style.boxShadow = pixels(toggled ? frameB : frameA, unit, '#7bffb0');
  toggled = !toggled;
  const left = parseFloat(sprite.style.left) || 38;
  let next = left + dir * 3;
  if (next > 62) dir = -1;
  if (next < 14) dir = 1;
  sprite.style.left = next + '%';
  sprite.style.transform = dir < 0 ? 'scaleX(-1)' : 'scaleX(1)';
}
step();
setInterval(step, 380);

1970~90년대 게임기는 화면 해상도와 색상 수가 극도로 제한적이었습니다(예: NES는 한 화면에 색 25개). 그 제약 안에서 캐릭터·배경을 표현하려니 자연스럽게 격자에 맞춘 사각 픽셀 단위로 그리게 됐고, 그게 하나의 미학으로 자리 잡았습니다.

지금은 하드웨어 제약이 없는데도 의도적으로 이 스타일을 쓰는 경우가 많습니다 — 인디 게임(〈Stardew Valley〉, 〈Undertale〉)이 대표적이고, 이유는 레트로 향수를 자극하면서도 적은 리소스로 많은 애셋을 만들 수 있기 때문입니다. 웹에서 구현할 때는 이미지를 확대해도 흐려지지 않도록 `image-rendering: pixelated`를 반드시 지정해야 하고(기본값은 부드럽게 보간해서 픽셀 경계가 뭉개집니다), CSS만으로도 `box-shadow`를 픽셀 좌표만큼 여러 개 겹쳐 그림을 그릴 수 있습니다.

폰트도 픽셀 격자에 맞춘 비트맵 폰트를 함께 쓰는 경우가 많아 일관성을 높입니다. 진지한 정보 전달용 UI보다는 게임, 레트로 테마 이벤트, 개발자 개인 사이트의 장난스러운 장식에 어울립니다.