본문 바로가기

예전/3D

[3D] 그래픽스 파이프 라인


그래픽스 파이프 라인



3D에 들어가기 전에 전반적인 방향을 잡기위해 그래픽스 파이프 라인에 대해 알아보겠다.





< 그래픽스 파이프 라인 >


위 그림은 그래픽스 파이프 라인의 흐름이다.

 







<렌더링 파이프 라인>


위 그림은 렌더링 파이프 라인의 과정이다.







 

<종합>




위 그림은 그래픽스 파이프 라인과 랜더링 파이프 라인을 합쳐놓은 그림이다. 대체로 이런 형식으로 흘러간다.


그래픽스 파이프 라인과 렌더링 파이프 라인은 같이 이해하면 좋기 때문에 서로 비교해 가며 설명하도록 하겠다.






1. 3D 모델 구축


3D 모델 구축은 어떤 모델의 자체 좌표에서 모델을 구축하는 것을 말한다. 다른 모델들과 독립적으로 모델을 구성할 수 있기 때문에 모델을 구성하기에 쉽다. CPU에서 처리가 일어난다.


3D 모델 구축 부분은 렌더링 파이프 라인에서 보자면 로컬 스페이스 부분과 비슷하다고 할 수 있다.

로컬 스페이스란, 물체간의 각각의 좌표계를 가진 스페이스로 물체를 구성하는 폴리곤 목록을 정의하는 좌표계이다.




2. 가상 공간에의 배치


구축한 모델을 월드 좌표계로 옮겨 하나의 장면을 구성하는 것으로 CPU에서 처리가 일어난다.


렌더링 파이프 라인에선 월드 스페이스 단계에 해당한다.

월드 스페이스란, 로컬 좌표로 구성된 다수의 오브젝트를 월드 좌표 시스템으로 옮겨 하나의 장면을 구성하는 것으로, 3D 공간 전체를 지배한다.






정점 파이프 라인


정점 파이프 라인이란 정점 차원의 처리가 이루어지는 곳으로 GPU 내부에서 처리가 이루어진다.


<정점 파이프 라인>




3. 정점 쉐이더 (정점에 대한 음영 계산)


GPU 에서 정점 단위의 좌표계 처리를 하기 위해 실행되는 프로그램이다.


DirectX8 이전 버전에서는 정점을 선언하는 동시에 포맷을 정의한 후 바로 바인드 했기 때문에 실행 중에 정점에 대한 정보 변경이 불가능했다.

DirectX9 버전 부터 2부분으로 나누어 선언은 DWORD의 스트림에서 D3DVERTECLEMENT9 구조체 배열로 바꾸고, 포멧은 SetFVF 함수를 통해서 정의 하게 했다.


쉐이더의 역할은 크게 정점 단위의 좌표계 처리, 정점 단위의 음영 처리, 텍스쳐 좌표 계산 3가지로 나뉜다.



- 정점 단위의 좌표계 처리


물체의 정점 정보에 수학적인 연산을 함으로써 하나의 좌표를 다른 좌표로 변환 시키는 처리를 한다. 행렬 연산을 통해 동차 좌표계의 정점으로 변환한다.


정점을 추가하거나 삭제하는 작업은 불가능하며, 이렇게 변환된 정점은 정점단위의 음영처리에 쓰인다.

로컬 좌표계를 월드 좌표계로 변환하는 작업으로 월드 내에서 위치, 회전과 관련된 작업을 수행한다.




- 정점 단위의 음영 처리


빛의 방향을 나타내는 광원벡터, 시선의 방향을 나타내는 시선벡터, 빛이 닿는 정점의 방향을 나타내는 법선벡터를 사용해 벡터의 상대 관계로 부터 어느 정도의 빛이 시선 방향에 대해 반사하는지를 나타내는 반사 방정식을 이용해 계산한다.



- 텍스쳐 좌표 계산


어느 폴리곤에 어떤 텍스쳐를 어떻게 붙여 나갈까에 대한 대응을 계산한다.

실제 매핑하는 픽셀 쉐이더가 처리를 잘 할 수 있게 준비해주는 역할을 한다.




4. 지오메트리 쉐이더 (Geometry Shader : 정점의 증감)


정점 쉐이더에 의해 변환된 도형 정보를 받아 정점 증감 처리를 수행한다.


지오메트리 쉐이더를 실행시키는 쉐이더 프로그램이 GPU에 입력된 정점 정보를 어떻게 증감시킬지를 지정한다. 

정점을 모두 없앨 수도 있고, 더 많은 도형을 만들어 내보낼 수도 있다. 정점 쉐이더에서는 할 수 없었던 점, 선, 폴리곤 등의 도형을 생성할 수 있다.

실질적으로 증감시키는 것은 복수의 정점이기 때문에 선분, 폴리곤, 파티클 등의 각종 기본형의 증감이 가능해졌다.


GPU에서 생성된 정점은 정점 쉐이더로 돌아갈 수 없다.



* 지오메트리 쉐이더의 활용에는 여러가지가 있다.





5. 카메라 공간으로의 전개


월드 좌표계로 변환된 좌표계를 카메라 시점에서 잡은 좌표계로 변환하고, 화면에 어떻게 보일지에 대한 처리를 한다.

렌더링 파이프 라인에서는 뷰 스페이스 단계에 해당한다.


뷰 스페이스란, 월드 내의 모든 기하물체를 카메라 관점에 맞춰 변환하는 것을 말하며, 2D 모니터로 장면을 찍기위한 중간 과정이다.


월드 내 어떤 위치에 존재하는 카메라를 원점으로 옮기고, 양의 Z축 방향으로 바라보도록 회전 또는 이동을 하며, 이에따라 월드 내의 모든 물체도 변환한다.


뷰 스페이스 변환을 하는 이유는 카메라가 월드 내 임의이 위치나 방위를 가진다면 오브젝트를 모두 카메라 시야 내에 넣어야 하기때문에 오브젝트를 이동시키거나 회전시키는 변환을 하여야 하는데, 이보다 카메라를 이동시키는 것이 보다 효율적이기 때문이다.



<A : 월드 스페이스내의 물체와 카메라,      B : 카메라를 원점으로 이동,        C : Z축에 맞도록 관찰 점과 물체를 회전>




처리


화면을 이동시킨 후 연산과 렌더링 할 양을 최소화 하기 위해 진행하는 처리들이다.





6. 컬링(Culling)


컬링이란 보이지 않는 부분을 제거하는 것(연산 하지 않는 것)으로 3 종류가 있다.



- 은면 처리(BackFace Culling)


후면 추려내기라고도 불리며, 카메라 시점으로부터 보이지 않는 뒷면을 그리지 않는 것으로 처리하는 것이다.


지정된 후면 판단 기준에 따라 후면이라고 판단된 폴리곤을 예외처리하고, 전면의 폴리곤만을 처리하는 기법으로 3가지 옵션이 있다.



 종류

설명 

 D3DCULL_CW

 시계방향으로 추려냄.

 왼쪽으로 두른 애만 그린다. 

 D3DCULL_CCW

 반시계방향을 추려냄.
 오른쪽으로 두른 애만 그린다.
 D3DCULL_NONE

 컬링을 하지 않음



폴리곤을 이루는 정점 사이의 방향 벡터로 연산하는 폴리곤인지 아닌지를 판단 한다.


정점 사이의 방향 벡터란 입력되는 정점의 순서대로 계산되는 벡터를 의미한다. 그 방향 벡터들로 방향을 판단 하고, 기준이 되는 방향과 반대 방향일 때 후면이라고 판단한다.



- 시각 절두체 컬링(View Frustum Culling)


3D상의 수많은 폴리곤과 오브젝트 중 실제로 카메라 시야범위에 포함되는 것들만 렌더링 하고, 나머지는 렌더링 하지 않는 기법을 말한다. 즉, 카메라가 비추는 영역 밖의 객체를 그리지 않는 것이다. 실질적인 컬링의 핵심이다.


절두체는 총 6개의 평면으로 이루어져 있다.






- 폐쇄 제거 (Occlusion Culling)


Occlusion이란 폐색이란 뜻으로 하나의 물체가 다른 물체에 의하여 부분적으로 가려져 안 보이는 것을 말한다.


오클루젼 컬링이란 어떤 오브젝트가 다른 오브젝트에 의해 가려져서 시야에 보이지 않을 때 해당 오브젝트의 렌더링을 비활성화 하는 기능이다.


예로 던전 내에서 던전 벽 건너편은 그리지 않는 것을 볼 수 있다.





위 그림은 전체 그림이고, 아래 그림은 좌하단의 Camera Preview 의 시야에 있는 오브젝트만을 렌더링 한 것이다.




7. 조명


조명 모델에서 광원이 만들어내는 빛은 3가지 요소로 구성된다.






- 환경광(Ambient Light)


다른 표면에 반사되어 전반적인 장면을 밝게 하는 빛을 모델링 한다. 반사된 빛을 비교적 쉽게 구현하는 방법이다.


- 난 반사광(Diffuse Light)


특정한 방향으로 진행하며, 표면에 닿으면 모든 방향으로 동일하게 반사한다. 관찰자의 위치는 고려하지 않으며, 광원에서 발산되는 가장 일반적인 빛이다.


- 정 반사광(Specular Light)

특정한 방향으로 진행하며, 표면에 닿으면 한 방향으로 강하게 반사해, 특정한 각도에서만 관찰이 가능하다.

난 반사광과 달리 빛의 방향과 표면 형태, 관찰자의 시점을 모두 고려해야 한다.



광원에는 세가지 타입이 있다.


타입 

 위치

방향 

예 

 점 광원   위치를 가짐 모든 방향으로 발산 (특정한 방향 없음)  백열 전구 
 방향성 광원

 위치 없음 

한 방향으로 평행하게 발산   태양
 스포트 라이트  위치를 가짐 특정한 방향으로 원뿔 형태의 빛을 발산  스포트 라이트 




8. 클리핑(Cliping)


시야로부터 완전히 벗어난 폴리곤을 그리지 않거나, 시야에 걸친 폴리곤을 잘라내는 처리이다.


클리핑은 단순히 그리기에 대한 예외 처리일 뿐 연산은 그대로 유지되고 있다. 이것이 클리핑과 컬링의 가장 큰 차이이다. 


화면에 보이지 않는 몬스터를 그리지 않기 위해선 클리핑 처리를 하고, 화면에 보이지 않는 움직이지 않는 오브젝트를 그리지 않기 위해서는 컬링을 해 연산도 하지 않는다.



9. 투영


3D 장면에서 2D 표현을 얻는 과정으로 크게 원근 투영과, 직교투영이 있다.


- 원근 투영

원근법 이용해 가까운 물체는 크게, 먼 물체는 작게 보이도록 하는 것이다.


- 직교 투영

원근감 없이 수직 위에서 내려다 보듯이 투영하는 방법이다.



10. 뷰포트


클리핑 된 영역을 화면이 보여질 클라이언트 영역인 직사각형 창으로 변환하는 과정이다.



11. 래스터 라이징 (Rasterizing)


폴리곤을 픽셀화 하는 것으로 2개 부분으로 나눌 수 있다.


- 트라이 앵글 셋업

폴리곤을 기준으로 어떤 픽셀을 렌더링 할 것인가를 결정하는 과정이다.


- 래스터 화

생성된 데이터들을 이용해 이미지를 만들어내며, 이 이미지를 올바르게 찍어내기 위해 각 픽셀에 정확한 색상을 지정하는 과정이다. 

스크린에 그려질 삼각형 정점 좌표가 결정되면, 삼각형이 포함하는 픽셀마다 플래그먼트를 생성한다. 상각형 정점에 할당된 여러 데이터를 보간해 각 플래그먼트에 할당한다.




픽셀 파이프 라인


정점 파이프 라인의 정보를 픽셀 쉐이더로 가져와 데이터를 처리하는 설계 구조로 픽셀 파이프 라인이 많을 수록 처리 속도가 빠르다.




픽셀 쉐이더


각각의 픽셀을 처리하고, 픽셀이 텍스쳐 좌표에 접근하는 능력을 제공한다.


* 여러 종류의 쉐이딩



12. 픽셀 단위의 음영 처리


픽셀 쉐이더에서 수행하는 계산으로 단위가 픽셀이라는 것만 제외하면, 정점 쉐이더와 비슷한 부분이 많다. 픽셀단위의 광원벡터, 시선벡터, 법선벡터들을 사용해 반사 방정식을 풀고, 그 픽셀이 어떤 색이 될 지를 결정하는 픽셀단위의 라이팅을 계산한다.


픽셀 단위의 라이팅 결과를 보간해서 색을 재 계산하는 것을 퍼픽셀 라이팅이라고 한다. 보다 온화한 조명과 아름다운 하이라이트를 낼 수 있다.



13. 텍스쳐 적용


정점 쉐이더에서 구해진 텍스쳐 좌표로 텍스쳐에서 텍셀을 읽어내는 것이 텍스쳐 유닛이다.

텍스쳐 유닛으로부터 가져온 텍셀의 색고 앞에서 구한 픽셀의 색을 고려해 최종적인 픽셀 색을 구한다.


* 텍스쳐 매핑의 종류



14. 랜더 백 엔드 (Render BackEnd)


비디오 메모리의 쓰기 제어 부분으로 출력해도 좋은 것인가의 검증과 어떻게 써 넣을 것인가에 대한 결정이 있다.


픽셀 쉐이더는 텍스쳐를 읽어낼 수는 있어도 메모리에 써낼 수 없기 때문에 픽셀 파이프라인에서 아주 중요한 부분이다.



- 출력해도 좋은 것인가의 검증


① 시저 테스트

프레임 버퍼에서 지정한 영역만을 화면에 출력하게 해주는 기능이다. 픽셀 단위 연산을 사용하므로 윈도우 좌표를 이용해 필요한 화면만 출력하게 영역을 지정해 줄 수 있다.


② 스텐실 테스트

스텐실 버퍼에 따라 프로그램이 설정한 조건을 통과하지 못하면 그 픽셀을 그리지 않는 것이다. 

화면의 일부를 도려낸다던지, 그림자의 형태를 뽑는 처리등에 응용된다.

 

-> 시저와 스텐실의 차이는 시저는 지정 영역만 보여주는 것이고, 스텐실은 지정 영역만 가리는 것이다.

③ 알파 테스트

출력하는 픽셀 색이 투명한지 아닌지를 테스트하고, 알파 성분이 0으로 투명하다면 그리지 않는다.


④ 깊이 테스트

현재 그릴 픽셀이 시점에서 봤을 때 가장 앞에 있어서 잘 보이는 픽셀인지 아닌지를 검사하는 테스트이다.

반 투명 3D 오브젝트의 반투명 픽셀의 경우는 깊이 테스트를 하지 않는 경우가 있다.


그리는 픽셀과 1대 1로 대응하는 Z버퍼에 픽셀 쉐이더에 의해 계산된 깊이 값을 넣어두고, 여기서 읽어낸 깊이 값과 현재 그리려 하는 픽셀의 깊이 갚을 비교해 값이 더 작은 것을 Z버퍼에 갱신하는 것입니다.



 


 


- 어떻게 써 넣을 것인가에 대한 결정


① 알파 합성 (알파 블렌딩)


픽셀을 덮어쓰기하는 것이 아니라 이미 써 넣어진 픽셀 색과 반투명 합성 색을 계산해서 다시 쓰는 처리이다. 렌더링 할 대상의 프레임 버퍼로 부터 픽셀의 색을 읽어 내므로, 비디오 메모리 읽기가 들어가지기 때문에 의외로 부하가 큰 처리이다.


② 안개 (Fog)

장면 내 개체의 깊이 또는 시점으로부터의 거리에 근거하여 장면 내의 개체의 색과 선택한 포그 색을 블렌드해 실현한다.

개체가 멀어짐에 다라 원래 색에 대한 포그 색의 블랜드가 늘어난다.


 

 

 

위 그림은 높이에 따른 안개를 준 것이다. 위 그림은 constant (정수) 밀도 높이 안개를 준 그림으로 안개 공식에서의 선형 포그 공식과 같다. 아래 그림은 Exponential(지수) 밀도 높이의 안개로 즉, 안개공식에서의 지수 포그 공식으로 계산한 그림이다.

 

* 안개에 대한 자세한 이야기


 

③ 안티 에일리어싱 (Anti - Aliasing)

 

우선 에일리어스 현상이란 그래픽에서 이미지를 표현할 때에는 픽셀이라는 작은 사각형을 최소단위로 사용하기 때문에 픽셀들이 모여 만들어진 이미지는 가장 자리가 톱니 모양으로 들쭉날쭉 하게 표현되는 계단 현상이다.

 

안티 에일리어싱은 이름 그대로 에일리어스 현상을 없애기 위한 방법으로 이미지의 가장 자리에 배경색과 이미지 색상의 중간색상을 단계적으로 채워줌으로써, 이미지를 가장자리를 부드럽게 만들어주는 기능이다.

 

안티 에일리어싱 한 양에 따라 픽셀이 각지고, 부드럽고의 차이가 난다.

 

 

어떻게 써 넣을 것인 가에대한 처리를 하지 않은 경우는 그 픽셀 색을 그대로 비디오 메모리에 써내는 처리를 한다. 그리고 이후의 다른 픽셀의 깊이 테스트를 대비해 깊이 값을 업데이트 해둔다.

 

 

 



 

'예전 > 3D' 카테고리의 다른 글

[UI엔진] 처음 내 프로젝트를 만들고서  (0) 2012.09.27
[3D] 김벌락 (Gimbal Lock)  (0) 2012.09.06
[3D] Direct3D 초기화  (0) 2012.09.06
[3D] 행렬  (0) 2012.08.06
[3D] 벡터  (0) 2012.08.06