[CG] 그래픽스 파이프라인

imacusirius·2021년 11월 10일
0

컴퓨터그래픽스

목록 보기
2/7


가상세계 물체를 만들 때는 카메라, 물체, 조명 등이 필요하다.

  • 카메라 위치는 gluLookAt() 함수로 설정한다.

이미지 생성 과정은 가상세계를 만들고, 카메라로 사진을 찍는 과정이다. 가상세계를 만드는 것을 모델링이라고 한다. 이 과정에서 빛이 필요하다.
사람의 눈 또는 카메라가 어떻게 작동하는지를 시뮬레이션한다. 실세계는 3차원 공간이고, 물체는 Object, 카메라 또는 눈을 Viewr라고 한다.

컴퓨터그래픽스는 3D에서 2D로의 매핑을 뜻한다. 3차원상에 물체(Object)와 카메라(Viewer)가 놓여 있다. 쉽게 생각해서 유리창 바깥의 풍경을 유리창에 가지고 오는 것이 컴퓨터그래픽스인 것이다. 즉, 3차원 공간을 2차원 이미지로 만든다.

카메라 시스템에 광원이 추가된다면 물체에 명암이 생기고, 그림자가 생긴다. 생각해 볼 점은 광원에서 빛이 어떤 방향으로, 얼마나 세게 나아갈 것인지다. 물체의 어떤 면은 빛을 많이 받아 밝게 보일 것이고, 어떤 면은 빛을 적게 받아 어둡게 보일 것이다. 즉, 광원은 물체의 표면을 결정한다. 빛은 R, G, B 세 가지 속성의 합으로 표현된다.

그림자인지 아닌지를 판단하는 방법은, 그림자가 위치한 공간으로부터 광원까지의 직선을 그리고, 그 선이 어떠한 물체와 교차하는지를 판단한다. 예를 들어 광원과 A 지점 사이에 정육면체가 있다면, A와 광원을 이은 직선은 정육면체의 면 중 최소한 하나와 교차할 것이다. 따라서 A 지점에 그림자가 발생한다.

광학에서의 빛은 전자기파에 해당한다. 하지만 그래픽스에서는 색, 경로로만 해석한다. 따라서 컴퓨터그래픽스에서 광원을 사용하려면 반사와 굴절, 회절을 어떻게 해석할지 고민해야 한다.

위 이미지처럼 한 광원에서 출발하는 빛의 수는 무수히 많다. 유의미한 빛은 이미지를 만들 카메라에 들어오는 빛이다. 이미지가 최종적으로 그려지는 곳은 모니터이다. 모니터는 픽셀로 이루어져 있고, 픽셀상에 그려진 이미지에 닿는 빛만 해석하면 된다.

Color System은 색상에 관한 이야기다. 각 픽셀에서는 어떤 색상을 담을 수 있을지에 대해 고민한다. 색상의 수는 무수히 많으나, 기본적으로 Red, Green, Blue 조합으로 이루어진다.
사람이 볼 수 있는 빛은 자외선과 적외선 사이의 가시광선이다.

바늘 구멍 사진기는 가장 간단한 기하학적 카메라 모델에 해당한다.

위 이미지에서 빨간색 점은 3차원 공간 상의 물체에 해당하고, 파란색 점은 투영된 2차원 공간 상의 이미지에 해당한다. 2차원 면에 맺힌 파란색 점들의 좌표를 xp,yp,zpx_{p}, y_{p}, z_{p}라고 하자. 아래 그림을 보면 두 삼각형은 닮음 관계에 놓여 있다. 따라서 xp=xz/dx_{p} = {-x \over z/d}, yp=yz/dy_{p} = {-y \over z/d}, zp=dz_{p} = {-d}로 수식화할 수 있다.

실제로 그래픽스에서 사용하는 카메라 모델은 합성 카메라 모델이다.
좌측 이미지처럼 사람의 눈에서 망막에 해당하는 것을 뒤에 놓는 것이 아닌, 앞에 가져다 놓는다. 물체 위치의 정의는 카메라와는 독립적이다. 합성 카메라 모델은 삼각법을 이용한다. 투영면(projection plane)을 물체보다 조금 더 앞으로 놓고, 거기에 그림이 그려지는 것으로 이해한다.

projection plane은 단순히 그림이 그려지는 평면이고, clipping rectangle은 투영면 상에서 실제로 보이는 부분을 뜻한다. 이미지를 나타내면 모니터 상에서 유한하게 보여진다. 따라서 보이는 공간 외의 부분은 불필요하다. 즉, 가시공간 외의 것을 잘라내는 것이 clipping이다.

Graphics System의 사용은 디자이너 관점과 프로그래머 관점으로 나눌 수 있다. 디자이너 관점은 CAD, animation tool(3DS, MAYA, 유니티 등)이 있고, 프로그래머는 디자이너들이 사용하는 툴을 개발하는 것이다. API로는 주로 OpenGL을 사용한다.

컴퓨터그래픽스에서 사용하는 API의 기본 구성은 Object 정의, Viewer 정의, Light Source, Materials 등이 있다.

OpenGL 구현의 예로, object를 정의하는 코드는 다음과 같다.

glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
	glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 1.0, 0.0);
    glVertex3f(0.0, 0.0, 1.0);
glEnd();

glBegin의 매개변수로 그려질 도형의 타입을 정할 수 있다.

camera를 정의할 때는 position, orientation, film plane을 고려한다. 카메라 세팅에 관련된 함수는 glLookAt 함수가 있고, 렌즈에 관한 함수는 gluortho2DgluPerspective가 있다.

광원을 정의할 때는 광원의 위치, 세기, 색상, 방향 등을 고려한다. 관련된 함수는 glLight, glMaterial(물체 재질) 등이 있다. 물체의 재질도 빛에 영향을 미친다. 동일한 빛을 받더라도 물체의 재질에 따라 반사율이 달라지므로 보이는 것도 달라진다.

Wire-frame 렌더링은 뼈대만 설정한 것이고, Flat Shading은 면을 이어붙여 채우는 것이다. 하나의 픽셀에 동일한 색만 채우므로 퀄리티는 떨어진다. Smooth Shading은 조금 더 부드럽게 이어지지만 빛 처리는 완벽하지 않은 상태이다. 여기에 텍스처 매핑과 그림자를 더하면 조금 더 퀄리티를 높일 수 있다.

그래픽스 파이프라인

  • transformation
    • 4x4 행렬 연산 이용, 위치와 방향 설정
  • clipping
    • 관측 공간 밖의 불필요한 부분 제거
  • projection
    • 3D object → 2D image로의 mapping
  • rasterization
    • image를 frame buffer에 저장하는 과정

변환과 클리핑까지의 결과물은 3D, 아날로그 상태이고, 투영은 2D로 바뀌었지만 여전히 아날로그이다. rasterization은 최종적인 디지털 결과물이다.

0개의 댓글