3D그래픽스의 개념과 렌더링파이프라인 (1/5)

Unity3D 2014. 4. 16. 11:00
반응형


2008-03-24 18:50:00
ここ最近までの3Dグラフィックスの歴史を大ざっぱに理解したところで、今度は3Dグラフィックスの処理の流れを解説したい。 3Dグラフィックスのパイプラインの模式図 3Dグラフィックスの流れを模式化したのが図1だ。 ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.


최근까지의 3D그래픽스의 역사를 대충 이해했으니, 이번에는 3D그래픽스의 처리 흐름을 해설하고 싶다.

3D그래픽스 파이프라인의 모식도(模式圖)

3D그래픽스의 흐름을 모식화한 것이 아래의 그림1이다. 이것은, 다이렉트X 10 세대 / SM 4.0 대응의 GPU까지의 흐름을 모식화하고 있는데, 일부 흐름의 순서가 GPU에 따라서 다른 경우나 또는 작은 처리단계에 대해서는 일부, 간략화한 부분도 있다. 이점은 양해해 주었으면 좋겠다.

우선, 왜 3D그래픽스 처리가 이렇게 되었는가 하는 근본적인 이야기에 대해서 짚어 보자. 이렇게 된 것은 길고도 짧은 실시간 3D그래픽스의 역사 속에서, 이것이 가장 처리가 매끄럽게 될 것 같고, 그리고 GPU(하드웨어) 의 설계로서도 구현(implementaion)이 (더) 쉽다는 이유 때문이다. 이 흐름은 Direct3D에서도 OpenGL에서도 큰 차이는 없다.

                                       그림1: GPU 내부에서의 렌더링 흐름

<그림 설명>
1: 3D 모델 구축
2: 가상공간에 배치
정점파이프라인
정점셰이더
3: 정점단위의 음영계산
지오메트리셰이더
4: 정점(프리미티브)의 증감(增減)
5: 카메라공간으로의 전개
6: 클리핑이나 음면처리
7: 트라이앵글 셋업과 래스터라이징 처리
픽셀파이프라인
픽셀셰이더
8: 픽셀단위의 음영처리
9: 텍스처 적용
10: 렌더 백엔드(필터, 깊이, 스텐실)(포그, 블렌딩)
11: 출력

CPU가 담당하는 3D그래픽스 처리부분 = 게임엔진!?

그림1에 있는 [1]과 [2] 항목은 주로 CPU에 의해서 수행되는 처리계이다.

3D오브젝트를 배치한다든지, 이동해서 재배치 한다든지....하는 부분에 해당되는 곳으로 이것을 시스템적으로 처리하는 것이 소위 「 게임엔진 」이라고 부르는 부분이다.

게임엔진에서는, 키 입력, 마우스 입력, 게임컨트롤러 입력에 따라서 3D 캐릭터를 이동시킨다든지, 총격이 적에게 명중했는지 안했는지 충돌판정을 한다든지, 충돌의 결과로, 3D 캐릭터를 날려버리기 위한 물리 시뮬레이션을 한다든지 하는데 이런 게임로직 부분은 어떤 의미에서 [1][2]에 해당하는 부분이다.

그리고 [2]는 다이렉트X 10 / SM 4.0 대응의 GPU인 경우 지오메트리셰이더를 활용하면, GPU에서도 가능하게 되어 있다. 예를들면 파티클이나 빌보드 같은 포인트스프라이트에 대해서는 생성이나 소멸을 지오메트리셰이더에 시켜서 CPU를 개입시키지 않고 처리하는 것이 가능하다. 그렇다고 해도 일반적인 3D게임 처리등에서는 아직 이부분은 CPU가 담당하는 부분이라고 할 수 있다. 

정점파이프라인과 정점셰이더~ 좌표계란?

그림속에서 빨간라인에 걸쳐있는 [3][4][5][6] 부분은, 정점차원의 처리를 하는 정점파이프라인이다.

보통은 여기부터가 GPU 내부에서 처리가 이루어지는 부분이 된다. 다만, 내부 로직을 간략화해서 낮은 비용으로 그래픽스 기능을 통합시킨, 이른바 「통합칩셋」등에서는, 이 정점파이프라인을 CPU에서 대신하는(emulation하는) 시스템도 존재한다.

좀전까지는 이 정점파이프라인을 「지오메트리 처리」등으로 부르는 경우도 많았다. 지오메트리(Geometry)라는 것은 「기하학」으로 고등학생 이상이면 수학에서 「대수, 기하」등의 수업시간에 「벡터연산」이나 「사영 또는 일차변환」등을 배운 적이 있었을텐데, 이것이 그런 세계의 것이다. 여담이지만, NVIDIA의 GPU인, GeForce 시리즈의 이름의 유래는 「Geometric Force(기하학적인 힘)」을 줄여서 만든 이름이고, 「G-Force(중력)」에 낚였다(끌렸다)는 농담도 존재한다.

이야기로 돌아가서, 3D그래픽스를 말할 때 반드시 등장하는 「삼차원 벡터」라는 개념은 간단히 말하면 「삼차원 공간상의 "방향"」 이라고 생각하면 된다. 그런 "방향"은 x, y, z 3개의 축의 좌표값으로 표시되고, 그 "방향"의 기준을 「좌표계」라고 한다.

이 좌표계에는 로컬좌표계와 월드좌표계(글로벌좌표계)라는 것이 있다.

「로컬좌표계」는, 구체적으로 말하면, 어떤 3D 캐릭터로부터 적당히 결정된 기준이 되는 좌표계이다. 3D의 방향은 그 3D캐릭터의 기준 좌표계에서 「어느쪽을 향하고 있다」고 관리하고 제어하는 방법이 편하다. 그래서 로컬좌표계라는 개념을 사용하는 것이다.

그런데, 일반적인 3D캐릭터에는 팔이나 다리가 붙어 있는 것이 많은데 이것을 그 관절로 부터 회전한다든지 하는 것을 생각하는 경우는 관절을 기준으로 한 로컬좌표계에서 제어하는 편이 쉽다. 그러나 이렇게 생각하면 로컬좌표계는 계층구조가 되버려 최종적으로 처리를 마무리 할 때에는 기준을 알수 없게 된다. 

거기서, 그 3D 공간전체를 지배하는 좌표계가 필요해 진다. 그것이 「월드 좌표계」이다. 3D그래픽스의 정점파이프라인의 정점단위 처리에서는 이 로컬좌표계로 부터 월드좌표계로의 변환이 빈번하게 일어난다.

이런 정점단위의 좌표계 변환 처리를 셰이더프로그램에 따라서 실행하는 것이 [3]의 「정점셰이더」(Vertex Shader)인 것이다. 셰이더프로그램을 다시 짜면 유니크하고 특수한 좌표변환을 할 수 있다는 것이다.(계속)

            그림2: 좌표계의 개념도

<그림 설명>
로컬 좌표계,
월드 좌표계


(トライゼット西川善司)

반응형
: