강의/컴퓨터 그래픽스

Image, 그래픽 파이프라인

SniKuz 2023. 12. 30. 16:50

목차

Vector vs Raster Image

Vector Image : 형태에 대한 Rule로 이미지는 정점과 정점 사이 수학적인 룰을 가진 형태로 용량이 적으며 화면에 크기에 따라 이미지에 형태가 변형되지 않습니다. 하지만 그만큼 복잡한 이미지일수록 형태를 표현하는데 부하가 걸립니다. 따로 특정한 Boundary(경계)가 없습니다.
.svg, .ill 등의 포맷 형태를 가지고 있으며 대표적인 벡터 이미지로 Font가 있습니다. (Truetype Font)

점 위치와 순서 쿼리

Raster Image : 비트맵이라고 부르기도 하며 한 화소 크기의 점 픽셀에 색 정보를 담아서 그림을 표시합니다. 대다수 이미지가 이 방식이며 특정 Bundary (화면 QHD크기 등) 내에 제한되어 표시됩니다. 빈 공간도 비어있다는 data를 저장해야하며 .png, .jpg 등의 포맷 형태를 가지고 있습니다.

각 이미지들은 Lossy, Lossless 압축으로 나뉩니다. 

대표적인 손실압축으로 jpeg/jpg가 있습니다. 압축을 하는 방식으로 색을 yCbCr 바꿔서 3개의 layer로 나누고 일정 간격별 색을 압축하고(다운 샘플링) 이미지를 보편적으로 쓰이는 방식으로 바꾼다고 하는데 더 자세한 내용은 https://www.youtube.com/watch?v=tHvZngU14jE (코딩애플 JPEG) 유튜브에서 소개됩니다.

반대로 대표적인 비손실압축은 png로 여러 방법이 있지만 블록단위로 압축하지는 않고 컬러테이블을 두어 이미지에 색에 매칭되는 컬러를 표현합니다.

 

 

Graphics Pipeline ( Rendering Pipeline)

그래픽스 / 랜더링 파이프라인은 정점(vertices) 집합을 프레임 버퍼의 픽셀로 변환하는 과정으로 정점과 정보들로 구성된 리소스를 모니터에 출력하는 단계적 방법으로 나눈 것을 의미합니다. CPU 파이프라인처럼 작업 단계를 나누고 더 최적화하는 것에 의의를 둡니다.

그래픽 파이프라인

Vertex Processor 

정점 처리를 하는 단계로 Object Space 내에 물체(정점)를 Space를 옮기는 처리를 하며 최종적으로 스크린 영역에서로 변환시킵니다.  즉, 3차원에 점을 2차원 화면상에 어떻게 표현될지를 결정합니다.
더 자세한 내용은 Viewing Transformation에서 소개됩니다. 이 정점을 처리하는 프로그램을 정점 셰이더라고도 합니다.

Primitive Assembly

위에 생긴 점들을 모아서 연결을 하면서 다각형을 만드는 과정입니다. 이를 통해 해당 점들이 선, 삼각형, 다각형, 어떤 물체인지 알 수 있습니다.

Clipper

카메라 시야 밖에 있는, 즉 보이지 않는 부분을 버리는 과정입니다. 이 때 카메라의 보이는 부분(View Volume)을 제외하며 버리며 이 때 View Volume은 Orthographic(정사투영), Perspective(원근투영) 중 결정되며 자세한 내용은 Viewing Transformation에서 소개됩니다.   이 과정은 primitive-by-primitive basis 내에 끝나야한다고 하는데 이는 이후 작업들을 진행하고 카메라에서 안보이는 부분을 삭제한다면 부하가 너무 심하기 때문인것 같습니다.

Rasterization

연속적인 선으로 구성된 다각형을 실제 스크린 화면에 어떤 Pixel에 해당하는지 계산하는 과정입니다.
계산된 값은 벡터그래픽에 가까울 텐데 이것을 래스터그래픽으로 바꾸는 과정입니다.
즉, 현재까지 만들어진 물체들을 실제 화면에 어느 픽셀에 해당하는지 알아내는 과정으로 이때 알아낸 각각 하나의 픽셀을 fragment라고 합니다.
이 과정을 거치면 primitive(원시적인, 기본적인)한 정보(색, 위치, 깊이 등)를 가진 fragment 집합을 output으로 받습니다.

Fragment Processing

fragment에 따라 프레임 버퍼의 픽셀을 업데이트 합니다.  이때 일부 fragment로 만들어진 물체는 앞에 다른 물체에 의해 가려질 수 있습니다. 보통 깊이 값을 따로 두어 자연스럽게 표현됩니다.