고정 기능 파이프 라인( Fixed Pipeline )
- D3D에 미리 정해진 연산을 수행할 수 있도록 제공되는 기능이 고정기능 파이프라인이다.
- 정해진 연산만 수행하므로 프로그래머가 GPU 연산에 관여할 수 없다.
프로그래머블 파이프라인 ( Programmable Pipeline )
- 고정 기능 파이프 라인에서 제공하는 것 이외의 효과를 내기 위해서 생겨난 프로그래머블 파이프 라인이다.
- 프로그래머가 GPU의 연산에 직접 관여할 수 있다.
- 고정적으로 제공하던 셰이더( Shader )를 프로그래머가 다양한 효과를 낼 수 있게끔 제공하게 되었다.
고정 기능 파이프라인과 프로그래머블 파이프라인의 차이점
- 프로그래머가 GPU 연산에 관여할 수 있냐? 없냐? 차이 < 정확하게 말하면, Fixed -> Programmable로 대체된 것이다. >
- 프로그래머블 파이프라인의 버텍스 쉐이더가 고정기능 파이프라인 과정 중 모델과 뷰스페이스 변환, 조명, 투영변환의 역할을 수행한다.
[ 렌더링 파이프라인 과정 설명 ]
1. 3D 모델 구축
- 3D 모델을 만들어서 '로컬 좌표계'에 띄우는 단계를 말한다. ( CPU 담당 )
- 랜더링 파이프라인 과정 중 '로컬 스페이스' 과정이다.
모델 표현
장면(scene)은 물체나 모델의 모음이다. 모델링 하는 물체의 기본 구성 성분인 다각형(Polygon)에서 두 개의 변이 만나는 지점을 버텍스(Vertex) = 꼭지점이다.
세 개의 버텍스로 정의된 하나의 삼각형
버텍스 포맷
Direct3D 내의 버텍스는 공간적 위치 이외의 부가적인 특성으로 이루어져 있다.(예를들어, 하나의 버텍스는 법선 특성이외에도 색상 특성을 가질 수 있다.) 버텍스 포맷을 구성할 수 있는 유연성을 제공하는데, 다른 말로 하면 버텍스의 속성을 정의할 수 있도록 해준다. 커스텀 버텍스 포맷을 만들기 위해서는 먼저 선택한 버텍스 데이터를 포함할 구조체를 만드들어야 한다.
삼각형
삼각형은 3D 물체의 기본 구성 요소로서, 물체를 구성하기 위해서는 물체의 모양과 외형을 묘사하는 삼각형 리스트를 만들어야 한다. 삼각형 리스트는 우리가 그리고자 하는 각각의 삼각형에 대한 데이터를 포함한다. 예를 들어, 사각형을 만들기 위해서는 두 개의 삼각형으로 나누고 각각의 삼각형을 구성하는 버텍스를 지정해야 한다.
사각형은 두 개의 삼각형으로 만들어진다. 삼각형(v0, v1, v2)과 삼각형(v0, v2, v3) = 사각형 삼각형의 버텍스를 지정하는 순서는 매우 중요하며 이를 두르기 순서(winding order)라고 부른다.
인덱스
3D 물체를 구성하는 삼각형들은 동일한 버텍스들을 공유하는 경우가 많다. 사각형 예제에서는 단 두 개의 버텍스가 중복되었지만, 모델의 복잡성과 세밀함이 증가할수록 중복되는 버텍스의 수 역시 증가한다.
예제 입방체 그림
입방체는 8개의 독특한 버텍스를 가지고 있지만 이방체의 삼각형 리스트에는 상당수의 버텍스가 중복될 것이다. 이 문제를 해결하기 위해 우리는 인덱스의 개념을 이용한다. 버텍스 리스트와 인덱스 리스트를 구성한다. 버텍스 리스트는 모든 독특한 버텍스들을 포함하며, 인덱스 리스트는 삼각형을 구성하기 위한 버텍스 리스트의 인덱스 값을 포함한다.
indexList 정의를 말로 바꾸어 설명한다면. 0,1,2를 이용해 삼각형0, 0,2,3을 이용해 삼각형1을 만든다. WORD indexLis[6] = {vertexList[0], vertexList[1], vertexList[2], vertexList[0], vertexList[2], vertexList[3]};
2. 가상 공간의 배치
- 구축한 3D 오브젝트( 모델 )을/를 ‘ 월드 좌표계’로 옮겨 하나의 장면을 구성하는 단계. ( CPU 담당)
- 랜더링 파이프라인 과정 중 '월드 스페이스' 과정이다.
3. 정점 단위 음영 계산
- 정점의 정보값( 좌표, 색상, 텍스처의 좌표., 조명 정보 ) 등을 변화시켜서 물체를 특별한 위치로 옮기거나 텍스처의 좌표를 바꾸거나, 색상을 바꾸는 일 등 한다. ( GPU 담당 )
4. 정점의 증감
- 버텍스 쉐이더에서 정점, 도형의 정보( primitive )를 받아서 그 정보를 가지고 버텍스를 증감시켜 새로운 도형정보를 만드는 것을 말한다.
※ 프리미티브 ( Primitive )
- 그래픽스 프로그램에 의해 개별적인 실체로 그려지고 저장, 조작될 수 있는 선·원 ·곡선 ·다각형과 같은 그래픽 디자인을 창작하는 데 필요한 요소. 기하학적 프리미티브라고도 한다. 예로들어 털, 그림자, 파티클, 모션블러, 테셀레이션, 물 등 효과에 사용
5. 카메라 공간으로의 전개
- 월드 좌표계로 변환된 좌표계를 카메라 기준으로 한 카메라 좌표계로 변환한다.
- 랜더링 파이프라인 과정 중 '뷰스페이스' 과정이다.
6. 컬링( Culling )
- 최종 씬에 보이지 않는 불필요한 폴리곤을 잘라내어 렌더링 및 연산에서 제외하는 기법이다.
- 렌더링 파이프라인 과정 중 후면추려내기 과정이다.
< 사용자에게 보이는 폴리곤 >
7. 조명 ( Lighting )
- 광선으로 밝게 비춤 또는 그 광선을 나타낸다.
- 3D 공간에는 빛이 없지만 현실 세계의 빛을 3요소로 만들어 흉내냄
- 조명의 요소에는 정반사광( Specular ), 난반사광( Diffuse ), 환경광( Ambient ) 등이 있다.
- 랜더링 파이프라인에 '조명' 과정에 해당한다.
- 광원 3가지인 방향성 광원( Directional Light ), 점 광원( Point Light ), 스포트 광원( Spot Light )이 있다.
8. 클리핑( Clipping )
- 화면에서 보이지 않는 부분은 그리지 않겠다는 의미
- 랜더링 파이프라인 과정 중 '클리핑' 과정에 해당한다.
시야 철두체에서의 삼각형 위치는 다음과 같이 세 가지로 분류할 수 있다.
- 완전한 내부 - 삼각형이 완전히 절두체 내부에 위치하면 그대로 보존되어 다음 단계로 진행한다.
- 완전한 외부 - 삼각형이 완전히 절두체 외부에 위치하면 추려내어진다.
- 부분적 내부(부분적 외부) - 삼각형이 부분적으로 절두체 내부에 위치하면 삼각형을 두 개의 부분으로 분리힌다. 절두체 내부의 부분은 보존되며, 나머지는 추려내어진다.
9. 투영( Projection )
- 3D 물체를 2D 평면에 표현하기 위하여 3D 모델 좌표를 2D 평면좌표로 변환하는 것을 의미한다.
- 렌더링 파이프라인 과정 중 '투영' 과정에 해당한다.
뷰 스페이스에서는 3D 장면의 2D 표현을 얻는 과정이 남아있다. 이와 같이 n 차원에서 n-1 차원을 얻는 과정을 투영(projection)이라 한다. 투영은 여러가지 방법이 있지만 원근 투영(perspective projection)이라는 방법으로, 원근법을 이용하여 기하물체를 투사한다. 즉, 카메라에서 멀리 떨어진 물체는 가까운 물체에 비해 작게 나타난다. 이와 같은 타입의 투영은 3D 장면을 2D 이미지로 표현하는 데 가장 적합하다.
투영 변환은 우리의 시야 볼륨(절두체)을 정의하고, 절두체 내의 기하물체를 투영 윈도우에 투영하는 과정을 담당한다. D3DX 함수를 이용하여 절두체 선언에 따른 투영 행렬을 만들어내는 방법만 알아두자.
절두체의 속성들
종횡비 인자를 계산하기 위해서는 약간의 작업이 필요하다. 투영 윈도우의 기하물체들은 결국 스크린 스페이스로 변환되는데, 정사각형(투영 윈도우)에서 직사각형인 스크린으로의 변환에는 왜곡이 따르게 된다. 종횡비는 간단히 말해 화면 너비와 높이의 비율이며, 정사각형에서 직사각형으로의 매핑에 의해 발생하는 왜곡을 보정하는 역할을 한다.
종횡비 = 화면 너비 / 화면 높이
투영 행렬을 얻기 위해서는 D3DTS_PROJECTIon에 변환 타입을 전달하고 IDirect3DDevice9::SetTransform 메서드를 호출하면 된다.
코드는 90도의 시야 각과 거리 1의 가까운 평면, 거리 1000의 먼 평면을 가지는 절두체에 맞는 투영 행렬을 만들어낸다.
10. 뷰포트 전개
- 프로젝트 윈도우의 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다.
- 윈도우와 상대적이며, 윈도우 좌표를 이용한다.
- 랜더링 파이프라인 과정 중 '뷰포트' 과정에 해당한다.
11. 폴리곤 셋업과 레스터 라이즈
폴리곤 셋업( Polygon Set up )
- 정점 파이프라인에서 정점 단위로 출력된 결과를 픽셀단위로 분해하여 픽셀 파이프라인으로 보내주는 작업이다.
- 랜더링 파이프라인의 레스터라이즈에 해당한다.
레스터 라이즈( Rasterize )
- 스크린 좌표로 버텍스들을 변환하면 폴리곤 정보를 가지게 되는데 레스터라이즈는 각각의 폴리곤을 출력하는데 필요한
픽셀컬러를 계산하는 과정이다. 단순하게 얘기하면 폴리곤을 픽셀로서 변경하는 과정이다. ( 그래픽 하드웨어 담당 )
12. 픽셀 파이프라인
- 정점 연산을 거쳐서 생성된 폴리곤의 픽셀들에 대해서만 연산을 한다.
13. 텍스처 적용
- 폴리곤과 광원,조명의 조합만으로는 실감나는 3D오브젝트를 표현하는데 한계가 있고, 광원, 조명효과는 많은 계산량을
필요로 하기 때문에 부하가 높아지는 문제가 생긴다. 이러한 문제점을 해결하기 위한 대안으로 나온 기술이다.
14. 랜더백엔드
- 픽셀셰이더 이후 넘어온 값을 써넣어도 좋을 것인가를 검증한 후 써넣을 방법을 정하는 것이다
> 써넣어도 좋은 것 인가의 검증
- 시저 테스트( Scissor Test ) = 사용자가 원하는 부분만 출력하는 방법
- 알파테스트( Alpha Test ) = α성분을 비교하여 그에 따른 출력을 결정
- 스텐실 테스트( Stencil Test ) = 사용자가 원하는 부분은 출력에서 제외 ( ex. 거울 효과, 그림자 효과 에서 사용 )
- 깊이 테스트( Depth Test ) = 렌더링 순위가 정해져 있지 않을 때만 깊이 값으로 정렬, 후면 버퍼의 깊이 버퍼와 비교하는 테스트
> 어떻게 써넣을까
- 알파 블렌딩( Alpha Blending ) = 두 픽셀을 가중치에 따라 섞는 방법
- 안개( Fog )
- 안티앨리어싱( Anti Aliasing ) = 앨리어싱을 잡아줌
- 비등반 필터링( Anisotropic Filtering )
- 이중선형 필터링( Bilinear Filtering )
- 알파 소팅( Alpha Sorting ) = 불투명을 먼저 그리고 , 반투명을 나중에 그리는 기법
15. 출력
출처 : https://m.blog.naver.com/jsjhahi/206651669
출처 : https://dlgnlfus.tistory.com/135
'그래픽스 > 공통' 카테고리의 다른 글
사원수 (Quaternion : 쿼터니언) (0) | 2022.07.25 |
---|---|
짐벌락 & 오일러 각 (Gimbal Lock & Euler Angle) (0) | 2022.07.25 |
절두체 컬링 (Frustum Culling)과 클리핑 (Clipping) (0) | 2022.07.03 |
Low-Level Layer (HAL, HEL) (0) | 2022.06.20 |
레이 트레이싱 (Ray Tracing) (0) | 2022.06.18 |