컴퓨터 그래픽: 0

컴퓨터 그래픽 관련 지식이 전무한 상태에서 여러 인터넷 자료를 토대로 학습한 내용을 정리한다.

래스터와 벡터

프레임 버퍼의 실체

컴퓨터 그래픽 결과물은 결국 2차원이다. 화면은 가로세로로 정렬된 픽셀들의 집합이고, 각 픽셀은 한 순간에 하나의 색만 표시할 수 있다. 이런 픽셀 집합의 색 정보는 프레임 버퍼(frame buffer)라는 메모리 블럭 안에 저장된다. 화면은 초당 여러 번 다시 그려지기 때문에 프레임 버퍼 안의 값이 바뀌면 화면의 그림도 거의 즉시 바뀐다. 즉 컴퓨터가 그림을 바꾼다는 것은 결국 “픽셀 색 정보를 저장한 메모리 내용을 바꾸는 것”이다.

CRT 모니터는 전자빔이 화면을 훑으면서 픽셀을 밝히는 방식으로 작동되었는데, 이를 래스터(raster)라고 한다. 강력한 자석이 빔을 이동시키고, 빔의 강도를 조절하여 색의 정도를 정하는 방식이다. 이때 프레임 버퍼에 저장된 색상 값은 전자빔의 강도를 결정하는 데 사용되었다. 현대의 평면 디스플레이는 동작 방식이 달라도 여전히 픽셀 격자와 색값이라는 개념을 사용하기에 래스터 그래픽(raster graphic)라는 용어 또한 사용된다. 색상 값이 부여된 픽셀 격자로 이루어진 이미지라는 개념이 곧 래스터 그래픽이다.

그림을 꼭 픽셀 하나하나로만 다뤄야 하는 것은 아니다. 벡터 그래픽(vector graphic)은 이미지를 픽셀의 색 목록으로 저장하는 대신, 어떤 위치에 어떤 선과 도형이 있는지에 대한 정보의 목록으로 저장한다. 선의 두께, 도형의 채우기 색 같은 속성도 함께 저장할 수 있다. 즉 래스터가 결과 중심이라면 벡터는 구조 중심인 셈이다.

같은 이미지를 래스터 그래픽과 벡터 그래픽으로 저장할 때 필요한 정보량이 크게 다를 수 있다. 이를테면 1000개의 선분을 저장할 때, 벡터 그래픽의 경우 선분을 이루는 양 끝 점 2000개의 정보만 저장하면 그만이다. 반면 래스터 그래픽의 경우 전체 화면의 색상 정보를 전부 저장해야 하기에 부담이 가중된다. 따라서 초기에는 벡터 그래픽 디스플레이가 적극적으로 이용되었으나, 시간이 흐르며 래스터 방식의 경제성이 향상되었고, 모든 유형의 이미지를 잘 표현할 수 있다는 장점도 있었기에 벡터 디스플레이를 대체하게 되었다.

페인팅과 드로잉

래스터 그래픽과 벡터 그래픽의 구분은 컴퓨터 그래픽의 여러 영역에서 여전히 존재한다. 이미지 생성에 사용되는 프로그램에도 두 가지 범주가 적용된다. 페인팅 프로그램(painting program)은 기본적으로 래스터 방식이기에 결국 각 픽셀의 색상 정보를 저장한다. 반면 드로잉 프로그램(drawing program)은 벡터 그래픽 방식에 가깝다.

물론 실제 프로그램에서 이 두 방식이 완전히 분리되어 있는 경우는 드물다. 드로잉 프로그램 안에 래스터 이미지를 하나의 요소처럼 넣을 수 있고, 페인팅 프로그램에서도 레이어(layer) 를 사용하면 서로 다른 요소를 겹쳐 관리할 수 있다. 즉 현실의 소프트웨어는 래스터와 벡터의 구분을 기반으로 하되, 실제 작업 편의를 위해 서로의 기능을 일부 받아들여 완성된다.

널리 알려진 그래픽 프로그램으로는 포토샵(Adobe Photoshop)과 일러스트레이터(Adobe Illustrator)가 있다. 이 중 포토샵은 페인팅 프로그램, 일러스트레이터는 드로잉 프로그램에 해당한다. 김프(GIMP)는 괜찮은 무료 페인팅 프로그램이며, 잉크스케이프(Inkscape)라는 무료 드로잉 프로그램 또한 존재한다.

이미지 파일 형식

이러한 차이는 그래픽 파일 형식에서도 드러난다. 파일에 저장된 비트에서 원본 이미지를 복원하려면 정해진 규격을 따라야 하며, 이러한 규격을 그래픽 파일 형식이라고 한다. 널리 사용되는 그래픽 파일 형식으로는 GIF, PNG, JPEG, WebP, SVG 등이 있다.

그 중 GIF, PNG, JPEG, WebP는 기본적으로 래스터 그래픽 형식이다. 이미지는 각 픽셀의 색상 값을 저장하여 표현된다. GIF는 간단한 애니메이션을 지원하며 최대 256색의 인덱스 색상 모델을 사용하고, PNG는 인덱스 색상 또는 24비트 전체 색상을 모두 사용할 수 있으며, JPEG는 풀 컬러 이미지에 적합하다고 한다.

손실 압축된 고양이 이미지

래스터 이미지 표현에 필요한 데이터 양이 많을 수 있고, 일반적으로 데이터에는 중복되는 정보가 많기에 이미지를 압축하여 저장하기도 한다. 압축에는 압축된 자료로부터 원래의 자료를 정보 손실 없이 온전히 되돌릴 수 있는 무손실 압축과 원래 데이터를 일부 손실하여, 압축된 데이터로부터 원본 데이터를 완전히 복원할 수 없는 손실 압축 두 방식이 존재한다.

GIF와 PNG는 무손실 데이터 압축을 사용하기에 선명한 그림, 텍스트, 아이콘, 선화 같은 데 적합하다. 반면 JPEG는 손실 데이터 압축 알고리즘을 사용한다. 언뜻 보기에는 좋지 않아 보일 수 있지만, 실제로 그 차이는 눈에 잘 띄지 않으며 손실 압축을 사용하면 압축된 데이터 크기를 더 크게 줄일 수 있기에 사진 이미지에 적합하고 경계가 뚜렷한 이미지, 특히 선 그림이나 텍스트가 포함된 이미지에는 부적합하다. WebP는 무손실 및 손실 압축을 모두 사용할 수 있다.

반면 SVG는 2차원 벡터 그래픽 이미지를 기술하는 XML 기반 언어다. 이는 확장 가능한 벡터 그래픽(Scalable Vector Graphics)의 약자로 기본적으로 벡터 그래픽 형식이고, 이름 그대로 이미지를 확대 해도 품질에 손상이 일어나지 않는다. 그렇기에 로고나 아이콘, 확대가 잦은 그래픽 요소에 적합하다.

3차원 그래픽

모든 디지털 이미지는 결국 어떤 좌표계를 바탕으로 구성되고, 2차원에서는 각 점이 두 개의 숫자 값을 가지게 된다. 점의 두 좌표는 흔히 x 좌표와 y 좌표라고 불리지만, "x"와 "y"라는 명칭은 임의적이다. 래스터 이미지에서는 각 픽셀이 행과 열에 따라 자연스럽게 좌표를 가지게 되는 반면, 벡터 이미지에서는 선과 도형을 보다 정밀하게 표현해야 하므로 보통 실수 좌표를 쓰는 것이 자연스럽다.

***

3차원 그래픽에서 이미지의 내용은 기하학적 객체의 목록으로 지정되며, 이를 기하학적 모델링(geometric modeling)이라 칭한다고 한다. 쉽게 말해 2D 래스터 그래픽은 보통 화면의 픽셀 하나하나를 다루는 방식에 가깝다면, 3D 그래픽은 먼저 장면 안에 물체들을 배치한다는 것이다. 3차원 공간 안에 물체를 놓으려면 각 위치를 숫자로 표현할 방법, 즉 좌표계가 필요하다. 세계 좌표계(world coordinates)는 보통 한 점을 (x, y, z)로 표현하며 “물체가 세계의 어디에 있는가”를 말하는 공통 기준이다. 세계 좌표계를 이용해 가상의 공간을 만들고, 그 안에 점, 선, 삼각형 같은 기본 도형들을 놓아 세상을 구성한다. 이후 이를 2차원으로 투영하는 것이다. 마치 세상을 카메라에 담듯.

***

3D 장면은 보통 아주 단순한 도형에서 시작한다. 이를테면 끝점 2개의 선분이나, 꼭짓점 3개의 삼각형 같은. 이를 기하학적 기본 요소(geometric primitives, 프리미티브)라 부른다. 이런 도형만으로 세상을 그려내기엔 현실의 물체가 너무 복잡하다는 문제가 있다. 그래서 복잡한 물체를 재사용 가능한 작은 구성 요소로 나눈 뒤 조립해 사용할 필요가 있다. 이를 계층적 모델링(hierarchical modeling)이라 한다.

기하학적 모델링을 이용해 바퀴 모델을 제작했다고 할 때, 자동차의 앞왼쪽, 앞오른쪽, 뒤왼쪽, 뒤오른쪽에 놓으려면 결국 위치를 바꿔야 한다. 이 때 바퀴를 이루는 수많은 점과 삼각형의 좌표를 하나하나 따로 바꾸는 것이 아니라, 바퀴 전체에 하나의 규칙을 적용하면 된다. 이를 기하학적 변환(geometric transform)이라 하며, 대표적으로 크기 조정, 이동, 회전 세 가지 종류가 있다.

***