해상도
고친 사람 github-actions[bot]
해상도는 무언가를 얼마나 잘게 나눠 구분할 수 있는지를 정합니다. 화면과 그림에서는 가로와 세로를 몇 칸으로 나누는지를 말합니다. 시간이나 측정값에서는 구분해 낼 수 있는 가장 작은 차이를 말합니다. 잘게 나눌수록 세밀하게 담습니다. 대신 다룰 칸도 그만큼 많아집니다.
쉽고 빠른 이해
화면의 해상도는 화면을 몇 칸으로 나눠 그리는지를 정합니다. 1920 × 1080 이면 가로 1920칸, 세로 1080줄이라 칸이 200만 개쯤 됩니다.
칸이 크면 둥근 선이 계단처럼 각집니다. 작은 글자는 뭉개집니다. 칸을 잘게 나눌수록 같은 모양이 매끈하게 보입니다.
- 화면을 가로 몇 칸, 세로 몇 줄의 격자로 나눕니다
- 칸마다 색 하나를 정해 메모리에 적습니다
- 모니터가 그 메모리를 읽어 칸마다 불을 켭니다
대가는 칸 수입니다. 가로와 세로를 둘 다 두 배로 늘리면 칸은 네 배가 됩니다. 색을 적어 둘 메모리도, 칸마다 색을 계산하는 일도 네 배로 늡니다.
상세
이 절은 주로 화면과 그림의 해상도를 봅니다. 시간과 측정값의 해상도는 마지막 소절에서 짧게 봅니다.
모눈종이에 옮겨 그리기
모눈종이의 칸을 칠해서 동그라미를 옮겨 그린다고 해 보겠습니다. 칸이 큰 종이에서는 동그라미가 울퉁불퉁한 계단이 됩니다. 칸이 잘은 종이에서는 같은 동그라미가 매끈해집니다. 대신 칠할 칸이 훨씬 많아집니다.
가로 칸 수와 세로 줄 수
화면은 작은 점을 격자로 늘어세워 그림을 냅니다. 점 하나는 한 번에 색 하나만 냅니다. 이 점 하나를 픽셀이라고 부릅니다. 앞의 모눈종이에서 칸 하나에 해당합니다.
해상도는 이 격자가 가로로 몇 칸, 세로로 몇 줄인지를 말합니다. 1920 × 1080 으로 적으면 가로 1920칸, 세로 1080줄입니다. 가로를 먼저 적는 것이 관례입니다.
칸이 성기면 사선과 곡선이 계단처럼 보입니다. 작은 글자는 획을 담을 칸이 모자라 뭉개집니다. 이렇게 칸이 모자라 모양이 깨지는 현상을 앨리어싱이라고 합니다. 해상도를 올리는 첫째 이유가 이것을 줄이는 것입니다.
칸의 총수는 두 수를 곱한 값입니다. 1920 × 1080 은 207만 칸이 조금 넘습니다. 흔히 보는 해상도를 칸 수와 함께 적으면 아래와 같습니다.
| 해상도 | 칸 수 | 흔히 부르는 이름 |
|---|---|---|
| 1280 × 720 | 약 92만 | 720p |
| 1920 × 1080 | 약 207만 | 1080p |
| 2560 × 1440 | 약 369만 | 1440p |
| 3840 × 2160 | 약 829만 | 4K |
이름 열의 앞 숫자는 세로 줄 수입니다. 예전에는 홀수 줄을 먼저 다 그리고 짝수 줄을 이어 그리는, 줄을 하나씩 건너뛰는 방식도 썼습니다. 뒤의 p 는 그러지 않고 위에서부터 모든 줄을 차례로 그린다는 뜻인 순차 주사를 가리킵니다.
3840 × 2160 은 가로가 4천 칸에 가까워 4K 라고 부릅니다.
가로와 세로의 비를 화면비라고 합니다. 표의 네 해상도는 모두 가로가 세로의 16/9 배라서 16:9 로 적습니다. 화면비가 다른 그림을 띄우면 위아래나 양옆에 빈 띠가 생기거나 그림이 늘어납니다.
두 배가 아니라 네 배
가로와 세로를 둘 다 두 배로 늘리면 칸은 네 배가 됩니다. 1920 × 1080 에서 3840 × 2160 으로 가면 207만 칸이 829만 칸이 됩니다.
아래 그림의 위쪽은 한 변을 둘로 나눠 네 칸입니다. 아래쪽은 한 변을 넷으로 나눠 열여섯 칸입니다.
block-beta columns 4 t1["한 변을 둘로 · 4칸"]:4 a1[" "]:2 a2[" "]:2 a3[" "]:2 a4[" "]:2 t2["한 변을 넷으로 · 16칸"]:4 b1[" "] b2[" "] b3[" "] b4[" "] b5[" "] b6[" "] b7[" "] b8[" "] b9[" "] b10[" "] b11[" "] b12[" "] b13[" "] b14[" "] b15[" "] b16[" "]
변마다 칸이 두 배가 되자 전체 칸은 네 배가 됐습니다. 화면을 그리려면 칸마다 색을 계산하고 그 색을 메모리에 적어 둡니다. 그래서 메모리와 계산이 모두 칸 수를 따라 네 배로 늡니다. 해상도를 한 단계 올릴 때 비용이 예상보다 크게 뛰는 까닭이 이것입니다.
해상도와 픽셀 밀도
같은 1920 × 1080 이라도 대각선 6인치 휴대폰 화면과 27인치 모니터는 다르게 보입니다. 칸 수는 같습니다. 칸 하나의 실제 크기가 다릅니다.
칸이 얼마나 촘촘하게 박혔는지를 픽셀 밀도라고 합니다. 길이 1인치에 픽셀이 몇 개 들어가는지로 잽니다. 단위는 PPI(Pixels Per Inch, 인치당 픽셀 수)입니다.
앞의 휴대폰은 약 367 PPI, 모니터는 약 82 PPI 입니다. 밀도가 높으면 눈이 칸 하나하나를 못 가려 선이 매끈하게 보입니다.
사람들은 이 밀도도 해상도라고 부릅니다. 「해상도가 높은 화면」이 칸이 많은 화면인지 칸이 촘촘한 화면인지는 맥락을 봐야 압니다. 인쇄에서는 1인치에 잉크 점을 몇 개 찍는지를 해상도라고 부릅니다. 이때는 DPI(Dots Per Inch, 인치당 점 수)로 적습니다.
밀도가 높은 화면에서는 글자가 작아지는 문제가 생깁니다. 글자를 늘 같은 칸 수로 그리면 칸이 작아진 만큼 글자도 작아집니다. 그래서 운영체제는 이런 화면에서 선 하나를 두 칸이나 세 칸 폭으로 그려 눈에 보이는 크기를 맞춥니다.
이때 두 가지 픽셀을 나눠 부릅니다. 프로그램이 크기를 적는 단위를 논리 픽셀이라 합니다. 화면의 실제 칸은 물리 픽셀입니다.
논리 픽셀 하나를 물리 픽셀 몇 개 폭으로 그리는지가 장치 픽셀 비율입니다. 이 값이 2 인 화면에서 논리 픽셀 100 폭의 버튼은 물리 픽셀 200 폭으로 그려집니다.
그래픽스에서 해상도가 정하는 것
화면에 그림을 그리는 쪽에서 해상도는 두 가지의 크기를 정합니다. 하나는 칸마다 값을 적어 둘 메모리입니다. 다른 하나는 칸마다 색을 계산하는 일의 양입니다. 둘 다 칸 수에 비례합니다.
화면에 보낼 색을 칸마다 적어 두는 메모리를 프레임버퍼라고 합니다. 모니터는 이 메모리를 읽어 칸마다 불을 켭니다. 칸 하나의 색을 4바이트로 적으면 한 장의 크기는 가로 × 세로 × 4바이트입니다.
| 해상도 | 한 장의 크기 (칸당 4바이트) |
|---|---|
| 1280 × 720 | 약 3.5메가바이트 |
| 1920 × 1080 | 약 7.9메가바이트 |
| 3840 × 2160 | 약 31.6메가바이트 |
표의 메가바이트는 1024 × 1024 바이트로 셌습니다.
칸마다 적는 것은 색만이 아닙니다. 칸마다 가장 가까운 물체까지의 거리를 적어 누가 앞에 보일지 가리는 깊이 버퍼도 화면과 같은 가로 × 세로로 잡습니다. 해상도를 올리면 색을 담는 메모리와 함께 이 메모리도 불어납니다.
해상도는 화면만 갖는 값이 아닙니다. 물체 표면에 입히는 그림인 텍스처도 저마다 가로 × 세로 칸 수를 갖습니다. 텍스처도 칸마다 색을 적어 두는 메모리라서, 해상도를 올리면 차지하는 메모리가 칸 수만큼 늡니다. 해상도가 낮으면 물체에 가까이 다가갈 때 표면의 칸이 크게 드러납니다.
일의 양은 그리는 과정을 따라가면 보입니다. 3차원 물체는 삼각형 여러 개로 적혀 있습니다. 그림을 그리는 장치인 GPU(Graphics Processing Unit, 그래픽 처리 장치)는 삼각형마다 그것이 화면의 어느 칸들을 덮는지부터 찾습니다.
이 단계를 래스터화라고 합니다. 삼각형은 꼭짓점 세 개의 좌표로만 적혀 있어서 그대로는 어느 칸을 칠할지 알 수 없습니다. 래스터화가 그 삼각형을 칸 단위로 바꿔 줍니다.
래스터화를 거치면 삼각형 하나가 칸 하나씩에 대응하는 조각 여러 개로 바뀝니다. 이 조각 하나를 프래그먼트라고 부릅니다.
조각마다 색을 계산하는 작은 프로그램이 프래그먼트 셰이더입니다. 이 프로그램은 조각 하나에 한 번씩 돕니다. 해상도가 네 배가 되면 같은 장면에서 조각도 대략 네 배가 됩니다. 이 프로그램이 도는 횟수도 그만큼 늡니다.
한 장을 그리는 일이 늘면 1초에 그릴 수 있는 장 수가 줄어듭니다. 1초에 몇 장을 그리는지를 프레임률이라고 합니다.
화면이 끊기지 않고 움직이려면 한 장을 정해진 시간 안에 끝내야 합니다. 그 시간은 목표 프레임률에서 나옵니다. 1초에 60장을 그리려면 한 장을 60분의 1초 안에 끝내야 합니다. 해상도는 그 한 장에 드는 시간을 직접 늘리거나 줄이는 값입니다.
그리는 해상도와 내보내는 해상도
화면의 해상도와 그림을 그리는 해상도가 꼭 같을 필요는 없습니다. 그림을 화면에 바로 그리지 않고 따로 잡은 메모리에 먼저 그릴 수 있기 때문입니다. 이 메모리를 렌더 타깃이라고 합니다. 크기는 그리는 쪽이 정합니다.
화면이 3840 × 2160 이어도 그림은 1920 × 1080 으로 그린 뒤 화면 크기로 늘려 내보낼 수 있습니다. 이렇게 작게 그려 늘리는 것을 업스케일링이라고 합니다. 칸 수가 4분의 1 이라 계산도 그만큼 줄어듭니다.
대가는 흐려짐입니다. 늘리는 동안 없는 칸의 색을 이웃 칸에서 짐작해 메워야 하기 때문입니다.
업스케일링이 작게 그린 그림을 늘리는 일이라면, 그리는 크기 자체를 장면에 따라 바꾸는 방식도 있습니다. 그릴 것이 많은 장면에서는 그리는 해상도를 낮추고 한가한 장면에서는 다시 올립니다. 이 방식을 해상도 스케일링이라고 부릅니다. 낮춰 그린 그림은 업스케일링으로 화면 크기에 맞춥니다.
거꾸로 화면보다 크게 그려서 줄이기도 합니다. 줄일 때는 칸 여러 개의 색을 평균 내 칸 하나로 만듭니다. 그 덕에 선 가장자리의 계단이 누그러집니다. 이 방식을 슈퍼샘플링이라고 합니다.
시간과 측정값의 해상도
그래픽스 밖에서 해상도는 재는 도구가 구분해 낼 수 있는 가장 작은 차이를 가리킵니다. 눈금이 1밀리미터인 자로는 그보다 작은 차이를 못 가립니다.
두 뜻은 뿌리가 같습니다. 화면을 몇 칸으로 나누느냐와 자의 눈금을 몇 칸으로 나누느냐는 모두 얼마나 잘게 나눠 구분하느냐를 묻습니다.
시간도 같습니다. 밀리초 단위로 세는 시계로 시각을 찍으면, 그보다 짧은 간격으로 일어난 두 사건이 같은 시각을 받습니다. 기록에 찍어 두는 시각인 타임스탬프로 사건의 순서를 가리려 할 때 이 한계에 부딪힙니다.
해상도는 정확도와 다릅니다. 해상도는 눈금이 얼마나 잘은가를 말합니다. 정확도는 읽은 값이 참값에 얼마나 가까운가를 말합니다. 나노초까지 적는 시계라도 시각 자체는 몇 밀리초씩 틀릴 수 있습니다.
관련 항목
화면 해상도를 재는 단위와 비율
픽셀 · 서브픽셀 · 픽셀 밀도 · PPI · DPI · 화면비 · 논리 픽셀 · 물리 픽셀 · 장치 픽셀 비율
화면 해상도를 가리키는 흔한 이름
720p · 1080p · 1440p · 4K · 8K · 순차 주사 · 비월 주사
해상도를 따라 크기가 정해지는 그래픽스 메모리
프레임버퍼 · 색 버퍼 · 깊이 버퍼 · 스텐실 버퍼 · 렌더 타깃 · 텍스처 · 텍셀 · 밉맵 · 그림자 맵
해상도가 오를수록 일이 늘어나는 처리 단계
래스터화 · 프래그먼트 · 프래그먼트 셰이더 · GPU · 필레이트 · 메모리 대역폭 · 오버드로
그리는 해상도와 화면 해상도를 따로 잡는 기법
업스케일링 · 다운샘플링 · 해상도 스케일링 · 동적 해상도 · 슈퍼샘플링 · 이미지 보간
해상도가 모자라 생기는 화면 결함과 그 처방
앨리어싱 · 안티앨리어싱 · 멀티샘플링 · 모아레 · 텍스처 필터링
해상도와 맞물려 화면의 움직임을 정하는 지표
프레임률 · 프레임 예산 · 주사율 · 수직 동기화 · 입력 지연
해상도에 따라 갈리는 그림 저장 방식
래스터 그래픽스 · 벡터 그래픽스 · 비트맵 · SVG · 이미지 압축
측정에서 해상도와 맞세워지는 개념
정확도 · 정밀도 · 오차 · 유효 숫자 · 양자화 · 샘플링
시간 해상도에 묶이는 시각 값과 단위
다른 이름: resolution · 화면 해상도 · 디스플레이 해상도 · display resolution