※ 아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.
렌더링 파이프라인
- 렌더링 파이프라인은 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는 데 필요한 일련의 단계 전체를 의미한다.
- 렌더링 파이프라인 순서
- 입력 조절기(IA) 단계
- 정점 셰이더(VS) 단계
- 덮개 셰이더(HS) 단계
- 테셀레이터 단계
- 영역 셰이더(DS) 단계
- 기하 셰이더(GS) 단계
- 스트림 출력(SO) 단계
- 레스터화기 단계
- 픽셀 셰이더(PS) 단계
- 출력 병합기(OM) 단계
- 입력 조립기(IA) 단계(5.5절)
- 메모리에서 기하 자료(정점들과 색인들)를 읽어서 기하학적 기본도형(삼각형, 선분 등)을 조립한다.
※ 색인들은 정점들을 어떤 식으로 조립해서 기본도형을 만들 것인지를 결정한다.
- Direct3D의 정점은 본질적으로 공간적 위치 이외의 정보도 담을 수 있다.
=> 이를 통해 좀 더 복잡한 렌더링 효과를 낼 수 있다.
- 정점들은 정점 버퍼라고 하는 특별한 Direct3D 자료구조 안에 담겨서 렌더링 파이프라인에 묶인다.
- 정점 버퍼는 그냥 일단의 정점들을 연속적인 메모리에 저장하는 자료구조일 뿐이다
=> 정점 버퍼 자체는 그 정점들을 어떤 식으로 조합해서 기본도형을 형성할 것인지를 말해주지 않는다
- 기본도형을 형성하는 방식을 Direct3D에게 알려주는 데 쓰이는 수단이 기본도형 위상구조(primitive topology)이다.
- 삼각형 띠(Triangle Strip)에서 짝수 번째 삼각형과 홀수 번째 삼각형의 정점 감기 순서(winding order)가 다름을 주목.
=> 선별 문제가 발생하지 않도록 GPU는 내부적으로 짝수 번째 삼각형의 처음 두 정점의 순서를 맞바꾸어서 홀수 번째 삼각형과 같은 순서가 되게 만든다.
- 정점들의 중복은 바람직하지 않다
1. 메모리 요구량이 증가한다. (같은 정점 자료를 여러 번 저장할 필요가 없는데 저장하게 되므로)
2. 그래픽 하드웨어의 처리량이 증가한다. (같은 정점 자료를 여러 번 처리할 필요가 없는데 처리하게 되므로)
==> 모형의 기하구조가 삼각형 띠에 적합한 방식으로 조직화되어 있다면 삼각형 띠를 통해서 중복 정점 문제를 완화할 수도 있다
==> 그러나 삼각형 목록이 더 유연하며(삼각형들이 연결될 필요가 없다), 따라서 삼각형 목록에서 중복 정점들을 제거하는 방법은 중요하다. 방법 중 하나로 색인(index) 사용
==> 고유한 정점들로 정점 목록을 만들어 두고, 어떤 정점들을 어떤 순서로 사용해서 삼각형을 형성하는지는 그 정점들의 색인들을 적절히 나열함으로써 지정한다.
==> 그래픽 카드는 정점 목록의 고유한 정점들을 처리한 후, 색인 목록을 이용해서 정점들을 조합해 삼각형을 형성한다.
- 정점들에서 '중복'이 없어진 대신 색인들에 중복이 발생하지만 2가지 이유에서 문제가 되지 않는다.
1. 색인은 그냥 정수이므로 완전한 정점 구조체보다 적은 양의 메모리를 차지한다. (정점에서 새로운 성분을 더 추가함에 따라 정점 구조체는 아주 커질 수 있다.)
2. 정점 캐시 순서가 좋은 경우 그래픽 하드웨어는 중복된 정점들을 (너무 자주)처리하지 않아도 된다.
- 정점 셰이더(VS) 단계
- 입력 조립기 단계에서 기본도형들을 조립한 후에는 정점들이 정점 셰이더 단계(vertex shader, VS)로 입력된다.
- 정점 셰이더를 정점 하나를 입력 받아서 정점 하나를 출력하는 함수로 간주해도 된다.
- 정점 셰이더 함수의 구체적인 내용은 프로그래머가 구현해서 GPU에 제출한다.
=> 해당 함수는 각 정점에 대해 GPU에서 실행되기 때문에 아주 빠르다.
- 정점 셰이더에서 입력 정점 자료 외에도 텍스처, 변환행렬, 장면 광원 정보 등 GPU 메모리에 담긴 다른 자료에도 접근이 가능하다.
- 3차원 장면을 위한 물체 모형을 만들 때, 물체의 기하구조를 장면 전역의 좌표계를 기준으로 직접 구축하는 것이 아니라 물체 자신의 국소 좌표계를 기준으로 구축한다.
=> 전자의 좌표계를 세계 공간(world space)라고 부르고 후자를 국소 공간(local space, 또는 지역 공간)이라고 부른다.
- 국소 좌표계 기준의 좌표를 장면 전역 좌표계로 변경하는 과정을 세계 변환(world transform) 이라고 부르고 해당 변환 행렬을 세계 행렬(world matrix)이라고 부른다.
=> 전역 공간 좌표계를 기준으로 한 국소 공간 좌표계의 원점과 축들의 위치 및 방향을 지정하고, 그에 해당하는 좌표 변경 변환을 수행해야 한다.
- 각 모형을 자신의 국소 좌표계에서 정의하는 데에는 여러가지 장점이 있다(180p)
1. 쉽다
2. 여러 장면에서 재사용되는 물체의 경우 재사용이 용이하다.
3. 한 장면에서 같은 물체를 위치, 방향, 비례 등을 달리해서 사용할 때도 훨씬 용이하다.(인스턴싱(instancing))
- 세계 행렬을 만들기 위해서는 세계 공간을 기준으로 한 국소 공간 원점 및 축들의 좌표를 알아야 함
=> 어려운 경우가 많음
=> 세계행렬 W를 SRT(비례x회전x이동) 행렬 형태로 정의하는 방법이 있음
- 예제 회전변환 공식 참고 사이트
※ 예제에선 시계방향 회전이므로 세타 값이 음수여야 한다는 점을 유의
회전 변환 행렬 (2D, 3D) - gaussian37
틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요.
감사합니다!
'DirectX11 > 정보정리' 카테고리의 다른 글
[DirectX11] 정점 버퍼와 색인 버퍼 (0) | 2022.11.07 |
---|---|
[DirectX11] 렌더링 파이프라인(2) (0) | 2022.11.05 |
[DirectX11] 색상 (0) | 2022.11.03 |
[DirectX11] DirectX3D 초기화(2) (0) | 2022.10.28 |
[DirectX11] DirectX3D 초기화(1) (0) | 2022.10.26 |
댓글