티스토리 뷰

프로그래밍/3D 프로그래밍 기초

3D 렌더링 파이프라인

알 수 없는 사용자 2016. 7. 10. 14:17

3D 렌더링 파이프라인이란

 

가상의 3차원 공간에 있는 데이터를 화면에 출력할 수 있는 2차원 데이터로 변환하는 과정

 

- 로컬 좌표계 : 3D 오브젝트를 모델링 할 때 사용되는 좌표계.

원점을 기준으로 각 정점들의 좌표가 저장되어 있는 좌표계.

 

- 월드 좌표계 : 가상의 3차원 공간을 나타내는 좌표계.

3D 오브젝트의 로컬 좌표에 (크기 변환, 회전, 이동 매트릭스를 곱한)월드 매트릭스를 곱해서

가상의 3차원 공간 상에 배치.

월드 매트릭스는 Scale, Rotation, Translation 매트릭스의 곱으로 이루어지고,

행렬 곱셈은 일반적으로 교환법칙이 성립하지 않으므로 곱하는 순서에 따라 다른 결과를 만들어 낼 수 있음.

아무런 변환 처리를 하고 싶지 않은 경우, 월드 매트릭스로 단위 행렬을 지정해 주어야 함.

예를 들어 월드 매트릭스로 단위 행렬을 지정하면, 로컬 좌표계와 동일한 위치에, 동일한 크기, 동일한 회전 상태로

오브젝트의 정점들이 변환됨.

 

- 뷰 좌표계 : 카메라 좌표를 원점으로 하여, 카메라의 시점에서 바라본 좌표계.

(0, 0, 0)이 원점인 월드 좌표계의 정점들을 카메라의 위치, 회전값만큼 역변환을 하여

카메라의 시점에서 봤을 때 위치로 이동.

 

카메라의 위치는 카메라의 위치에 대한 이동 행렬에서 위치값에 해당하는 (4,1) (4,2) (4,3) 원소에 -1을 곱해 주면 역변환이 되고

회전값은 우향, 상향, 전방 벡터가 서로 직교이고 크기가 1일 때, 각 벡터를 x, y, z축에 정렬하는 행렬 A가 있다고 하면

세 벡터를 합친 행렬 B에 행렬 A를 곱하면, x, y, z 축 방향의 단위 벡터를 행 벡터로 하는 행렬 C가 나온다.

이 때 행렬 C는 단위행렬이므로, B * A = I(단위행렬) 가 되고 변환행렬 A는 B의 역행렬이라는 결론이 나온다.

B는 카메라의 우향, 상향, 전방 벡터를 합친 행렬이고, 직교 행렬(각 행 벡터가 직교, 크기가 1인)이므로

역행렬과 전치행렬이 동일하다.

그러므로 회전에 대한 역변환은 행렬 B의 전치행렬이 된다.

위치에 대한 역변환 행렬과 회전에 대한 역변환 행렬을 더하면 카메라 위치를 기준으로 변환할 수 있는

뷰 매트릭스가 된다.

 

- 프로젝션 좌표계 : 3D 공간에서 투영된 정점이 그려질 2D 좌표계.

카메라의 시야각, 시야 거리만큼 절두체를 계산하고 그 안의 정점들을 투영할 윈도우에 맞춰서 변환.

 

- 뷰포트 좌표계 : 뷰포트(그려줄 화면)를 기준으로 한 좌표계.

투영 윈도우의 좌표를 뷰포트에 맞추어 변환.

 

 

렌더링 파이프라인을 간소화하면 이런 형태가 된다.

 

로컬 좌표계(고유의 공간에 정점 배치) -> 월드 좌표계(전체적인 장면을 나타낼 3D 공간에 배치) ->

뷰 좌표계(카메라 위치 기준으로 변환) -> 프로젝션(투영) 좌표계(카메라 시야 만큼 투영) ->

뷰포트 좌표계(화면 출력)

 

 

 

+ 연산량을 줄이기 위한 행렬 간소화

로컬 좌표에서 각 정점을 렌더링 파이프라인을 따라 변환 행렬을 곱해주게 되면

정점의 개수에 따라 연산량이 압도적으로 증가한다.

예를 들어 1000개의 정점으로 이루어진 물체를 출력한다고 해 보자.

연산량을 계산해보면 1000(정점) x 월드 매트릭스 x 뷰 매트릭스 x 프로젝션 매트릭스 x 뷰포트 매트릭스

1000개의 정점에 4번씩 총 4000번의 변환 처리를 해 주어야 한다.

하지만 행렬의 곱셈은 결합법칙이 성립하므로, 월드 매트릭스부터 뷰포트 매트릭스까지의 행렬을 미리 곱해서 나온

최종 행렬을 각 정점에 곱해 주면 1000개의 정점을 한번씩만 변환해 주면 된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함