본문 바로가기
DirectX11/정보정리

[DirectX11] 렌더링 파이프라인(1)

by 마두식 2022. 11. 3.
반응형

※  아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.

 

렌더링 파이프라인
  • 렌더링 파이프라인은 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는 데 필요한 일련의 단계 전체를 의미한다.

 

  • 렌더링 파이프라인 순서
  1. 입력 조절기(IA) 단계
  2. 정점 셰이더(VS) 단계
  3. 덮개 셰이더(HS) 단계
  4. 테셀레이터 단계
  5. 영역 셰이더(DS) 단계
  6. 기하 셰이더(GS) 단계
  7. 스트림 출력(SO) 단계
  8. 레스터화기 단계
  9. 픽셀 셰이더(PS) 단계
  10. 출력 병합기(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

댓글