먼저 랜더링 파이프라인에 대한 영상을 보고 시작하자. 아래 영상이 컴퓨터 그래픽스를 이해하는데에 최고의 영상인 것 같다.
1. Local space에서의 각각의 물체들을 Model Matrix로 변환해주어,
2. 하나의 우주인 World space 속에서 그 크기와 위치 회전 등이 적절하게 바뀌어 예쁘게 자리 잡고, (Local space -> World space)
새롭게 구성된 하나의 우주 속 물체를 앞에서 보느냐 옆에서 보느냐에 따라 3D 화면이 다르게 나타나듯, World space에서 어느 시선으로 보고있느냐에 따라 View Matrix로 카메라 시선에 따라 변환해 준다. (World space -> Camera space, View space)
3. 여기에서 모니터의 2차원 면에서 보았을 때의 이미지 단면 정보만을 추려내는 Projection Matrix 로 변환해준다면 World space에서 필요없는 3차원 정보들을 탈탈 털어낸 단면을 보여주는 Clip space를 만든다. (Camera space -> Clip space)
4. 이렇게 각각의 space에서 각각의 크기로 따로노는 물체들의 Mesh 정보를 하나의 우주에 적절하게 변형하여 배치한 뒤, 바라보는 카메라 시점에 따라 2차원으로 바꾸는 과정을 각 삼각형 꼭지점 Vertex 정보 변형하는 과정이라고 하여 Vertex shading라고 부른다.
5. 그리고 이제 삼각형 그물 속 어떤 부분을 픽셀로 표현할지 결정하거나 픽셀로 표현되어야할 부분을 계산하는 과정을 Rasterization이라고 부른다.
6. 이렇게 제각각 가지고 있는 색깔과 방향정보를 기반으로 그 사이사이를 서서히 색이 변해가는 것으로 채워주고(Interpolation),
7. 색깔 뿐만 아니라 방향 위치 등 사이사이 값으로 부드럽게 채워주는 Pixel shading 과정을 거치면 최종적인 픽셀의 색이 결정된다.
8. 사실적인 픽셀 색감을 결정하기 위해 포장지로 삼각형 그물로된 물체를 감싸는 Texturing이나, 음영을 다양한 특성으로 추출하는 Phong shading이나 Phisically Based shading을 사용한다.
9. 이제 그림자와 빛 효과도 삼각형 그물로 죄다 표현해주어야 한다. 이때 Ray tracing 알고리즘을 사용한다. Ray tracing은 우리 눈이 바로보는 시점에서 보이는 빛들만 역추적하여 빛과 그림자의 효과가 나타날 부분들을 따라가 계산하게 된다.
10. 그리고 물체들이 겹쳐져서 표현이 되는 부분 등을 말끔하게 처리한 Output Merge 과정까지 거치면 랜더링 파이프라인을 마치고 우리 눈으로 볼 수 있는 2차원 화면이 완성된다.
3차원 컴퓨터 그래픽스는 아래와 같은 과정을 통해 제작된다.
이중 modeling, rigging, animation까지는 그래픽 디자이너의 영역이고 맥스, 마야등을 이용하여 제작한다.
런타임에는 프레임별로 rendering과 post-processing이 진행된다.
모델링은 모델을 제작하는 과정이며, 컴퓨터가 처리할 수 있는 방식으로 표현된 물체를 모델이라고 표현한다.
물체들(object)은 삼각형의 집합인 폴리곤으로 만들어 지는데 폴리곤으로 만들어진 물체는 polygon meshes라고 부른다.
이 위에 texture를 표면에 붙여 물체를 제작하도록 한다. 이때 texture를 제작하는 단계도 모델링에 포함된다.
얼굴이 좀 기괴스럽게 보이긴 하지만 texture를 polygon mesh에 붙여넣으면 그럴듯 하게 만들어지는 것을 볼 수 있다.
이런 과정을 texturing 이라고 한다.
어찌됐건 모델링 단계에서는 3차원 polygon mesh를 만들고 texture를 만들어야 한다.
근데 야구 선수는 움직이고, 이 움직임을 표현해야 한다.
가장 기본적인 것이 아래처럼 뼈로 구성된 골격을 사용하는 것이다.
Rigging은 골격을 만들고 그 골격과 모델을 붙이는것으로 움직임을 표현할 때 골격의 움직임을 통해 표현한다.
따라서 해당 움직임에 대해 모델이 변화하는 방식을 만들어내고자 이러한 Rigging을 한다.
Rigging이 수행되면 Animation을 만들 수 있다.
skeleton model의 sequence를 정의함으로써 모션을 만들 수 있다.
다음으로 하나의 장면이 주어졌을 때 이를 2차원 영상(frame)으로 만드는 작업을 Rendering이라고 한다. 위에서 만들어진 texture를 물체 표면에 입히고 빛을 표현하는 lighting등을 포함한다. 빛이 어디서 쪼이느냐에 따라 그림자가 어디에 만들어지는지를 수행한다.
따라서 Rendering은 texturing과 lighting이 기본이다.
Post processing(후처리)는 motion blur 효과 등을 추가하여 조금더 사실적인 표현을 가능하도록 한다. 꼭 해야하는 필수적인 작업은 아니므로 선택적으로 수행한다.
runtime animation과 렌더링, 후처리 등은 이전 작업들과 다르게 개발자에 의해 처리된다. 이때 실시간 그래픽의 경우 게임엔진을 통해서 만들어지는 경우가 많은데 이러한 게임 엔진에는 대표적으로 언리얼과 유니티가 있다.
이러한 게임 엔진은 3D 그래픽 API 위에서 만들어지는데 그래픽 api에는 여기서 다루는 opengl 이외에도 direct X, metal등이 있다.
이러한 API에는 그래픽스 응용에 필요한 함수들을 제공하고 있고 속도를 위해 이러한 함수들의 일부 과정들은 gpu내에서 하드웨어로 구현되어있다. 따라서 이러한 그래픽 api는 gpu에 대한 소프트웨이 인터페이스로 볼 수 있다.
Ref.
Introduction to Computer Graphics with OpenGL ES (J. Han)
'☘️ Computer Graphics > Fundamental' 카테고리의 다른 글
CG - Image Texturing (0) | 2022.07.18 |
---|---|
CG - Rasterizer (0) | 2022.07.16 |
CG - Vertex Processing (0) | 2022.07.15 |
CG - Spaces and Transforms (0) | 2022.07.14 |
CG - Modeling (0) | 2022.07.12 |