- 모니터 픽셀 안의 서브픽셀을 게임 칸으로 쓰는 Snake 게임으로, 너무 작아 제대로 플레이하려면 현미경이 필요함
- 기존 JavaScript Snake를 바탕으로 열 위치별 색상과
mix-blend-mode: lighten을 조합해, 같은 물리 픽셀 안의 여러 서브픽셀이 함께 보이게 만듦 - 정상 동작하려면 RGB stripe 서브픽셀 구조와 CSS 픽셀·물리 픽셀 정렬이 필요하며, iMac에서는 줌아웃으로 맞췄지만 iPad에서는 통하지 않았음
- 현미경으로 확인하자 sRGB 초록색이 초록 서브픽셀만 켜지지 않고 빨강·파랑도 함께 켰고, 최신 디스플레이의 더 넓은 색역이 원인으로 확인됨
- Lab color를 쓰자 iMac에서 빨강과 초록 서브픽셀을 분리할 수 있었지만, 픽셀 구조가 RGB stripe에서 벗어나고 있어 장기 호환성은 약함
서브픽셀을 게임 보드로 쓰기
- 이 Snake 게임은 모니터의 일반 픽셀이 아니라 픽셀 내부의 빨강·초록·파랑 서브픽셀을 게임 칸처럼 사용함
- 가까이서 보면 화면의 픽셀은 여러 서브픽셀로 구성되어 있고, 멀리서 보면 사람 눈에는 이 빛들이 섞여 하나의 색으로 보임
- 크리스마스에 받은 매크로 렌즈로 여러 화면을 촬영하면서, 디스플레이마다 서브픽셀 형태가 다르다는 점을 확인함
- Chevron 형태
- stripe 형태
- diamond 패턴
- 이런 배열 차이는 서브픽셀 기하 구조로 불리며, 제작자의 iMac은 RGB stripe 구조를 사용함
구현 방식과 현미경으로 드러난 한계
- 15년 전에 만든 JavaScript Snake를 서브픽셀용으로 바꾸는 기본 구현은 비교적 단순했음
- 게임 열 수를 줄임
- 특정 열의 Snake 블록이 특정 색으로 표시되게 함
mix-blend-mode: lighten을 적용해 같은 픽셀 안에 여러 블록이 있어도 모두 보이게 함
- 실제로 동작하려면 두 조건이 맞아야 했음
- 사용자가 RGB stripe 서브픽셀 구조의 모니터를 써야 함
- 브라우저의 CSS 픽셀이 물리 픽셀과 정렬되어야 함
- CSS 픽셀 정렬은 줌아웃으로 맞출 수 있었지만, 이 방법은 iMac에서만 동작했고 iPad에서는 실패함
- 구현은 빠르게 끝났지만 서브픽셀 단위 표시를 눈으로 확인할 수 없어, 온라인에서 산 저가 현미경으로 실제 화면을 촬영함
- 현미경으로 보니 초록색을 표시할 때 초록 서브픽셀만 켜지지 않고 여러 서브픽셀이 함께 켜졌음
- 처음에는 버그로 의심했지만 코드에는 문제가 없었음
- 단색 초록을 확인하자 iMac에서 초록뿐 아니라 빨강·파랑 서브픽셀도 켜짐
- 휴대폰에서도 초록색이 빨강 서브픽셀을 약하게 켰음
- 서브픽셀 기하 구조 페이지 운영자에게 문의한 결과, 원인은 sRGB 표준과 최신 디스플레이 색역의 차이였음
- sRGB는 화면 성능과 색역이 더 좁던 시기에 만들어짐
- 최신 화면에서 초록 서브픽셀만 켜면 sRGB 초록보다 더 채도가 높은 색이 나올 수 있음
- 원하는 sRGB 초록을 정확히 표시하려면 빨강, 경우에 따라 파랑도 함께 더해져야 함
- RGB 색 정의를 Lab color로 바꾸자, 더 큰 색공간을 활용해 iMac에서 빨강과 초록 서브픽셀을 분리할 수 있었음
- 다만 픽셀 기하 구조가 RGB stripe에서 멀어지고 있고, 미래의 서브픽셀이 지금과 완전히 다르게 켜질 수 있어 이 방식은 오래 유지되기 어려움