마인크래프트 블록에 색상을 매칭하는 건 보기보다 어렵다
두 블록이 RGB 값은 똑같아 보여도 벽에 놓으면 완전히 달라 보인다. 게임이 렌더링하는 모든 면에 음영을 넣기 때문이다.
평균 색상이 과녁에 가장 가까운 블록을 고르면 보통은 틀린다. 마인크래프트는 블록을 텍스처의 평균 색상으로 그리지 않는다. 텍스처에 면별 밝기를 곱하고, 다시 그 위치의 빛 레벨을 곱한다. 스크린샷에서 추출한 색상은 이미 그 음영이 적용된 결과물이므로, 그대로 최근접 색상 검색에 넣으면 어떤 블록도 실제로 표시하지 않는 값과 비교하게 된다.
평균 RGB가 실패하는 이유
평균 RGB는 세 채널을 똑같이 중요하게 취급하고, 선형적으로 변한다고 가정한다. 둘 다 사실이 아니다. 인간의 시각은 파란색보다 초록색의 차이에 훨씬 민감하고, 같은 수치 크기의 색상 차이라도 어두운 톤에서 훨씬 크게 느껴진다. 두 블록이 과녁으로부터 같은 RGB 거리에 있어도 벽에 놓으면 전혀 닮지 않을 수 있다.
CIELAB은 바로 이 문제를 해결하기 위해 만들어졌다. Lab에서 같은 수치 거리는 대략 같은 지각적 차이에 대응한다. Lab에서 매칭하기 때문에 팔레트 도구가 단순히 헥스 코드만 공유하는 블록이 아니라 진짜로 올바른 색으로 읽히는 블록을 제안할 수 있는 것이다.
텍스처는 한 가지 색이 아니다
블록 텍스처는 픽셀 정사각형이고, 대부분 단색이 아니다. 16×16 텍스처에는 256개의 픽셀이 들어 있고, 거친 돌이나 얼룩덜룩한 잎 텍스처는 넓은 톤 범위에 걸쳐 퍼져 있다. 이를 하나의 평균으로 줄이면 분산—모자이크가 매끄럽게 읽히는지 얼룩덜룩하게 읽히는지를 결정하는 부분—을 버리게 된다. 팔레트 매처는 실제 텍스처 파일과 비교하므로, 보고하는 거리는 블록이 실제로 담고 있는 내용을 반영한다.
Java와 Bedrock은 여기서 갈린다
두 에디션은 동일한 텍스처를 제공하지 않고, 음영 처리 방식도 동일하지 않다. Java는 자체 파이프라인을 통해 방향성 면 밝기와 바이옴 틴팅을 적용하고, Bedrock은 틴팅과 일부 블록 색상을 다르게 처리한다. 한 에디션에서 완벽하게 매칭되는 팔레트가 다른 에디션에서는 눈에 띄게 어긋날 수 있으며, 특히 잔디, 잎, 물에서 그렇다. 실제로 블록을 놓을 에디션에서 팔레트를 만들어라.
이미지에서 모자이크로
모자이크는 격자이고, 각 셀이 하나의 블록이 된다. 여기서 두 가지가 따라온다. 첫째, 이미지는 매칭 전에 격자 크기로 다운샘플링해야 한다. 매칭 후가 아니라. 전체 해상도에서 매칭한 다음 축소하면 더 이상 존재하지 않는 디테일에 맞춰 선택된 팔레트가 나온다. 둘째, 출력은 .mcfunction이므로, 전체 건축물이 손이 아니라 명령어로 배치된다. 명령어 개수는 이미지의 픽셀 수가 아니라 셀 수에 비례한다.
투명도 함정
부분 알파를 가진 픽셀에는 대응하는 단일 블록이 없다. 이것이 공기, 유리 변형, 또는 가장 가까운 불투명 매치 중 무엇이 될지 미리 정해야 한다. 매처는 의도를 추측할 수 없고, 그렇지 않으면 가장 가까운 단색으로 흡수해 버리기 때문이다.
준비된 .mcfunction로 이미지를 블록 모자이크로 바꾸거나, 어떤 색상에든 가장 가까운 바닐라 블록을 픽셀 아트 & 블록 팔레트에서 찾아보세요.