ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ DirectX 12 ] - Graphics Pipeline - 1
    DirectX 2021. 5. 20. 21:35

    DirectX 12 Graphics Pipeline

     

    DirectX 12의 그래픽 파이프라인은 몇 가지의 단계[Stage]로 구성되어 있습니다. 몇몇 단계들은 'Fixed'즉 고정되어 있는데 이는 Shader Programme을 갖지 않으며 오직 DirectX 12의 APIs의 함수들을 통해서만 구성[Configure]할 수 있다는 뜻입니다. 다른 단계의 경우엔 Shader Programme이 제공되며 이를 통해서 사용자 나름의 구성을 할 수 있습니다. 다음 그림이 그래픽스 파이프라인의 여러 단계들을 묘사한 것입니다. 화살표의 방향이 하나의 단계에서 다른 단계로의 데이터의 흐름을 나타내며 GPU 메모리에서 버퍼[Buffer]나 상수버퍼[Constant Buffer], 텍스쳐[Texture]들이 각 단계로의 흐름을 나타냅니다.

    Learning DirectX 12 – Lesson 1 – Initialize DirectX 12 3D Game Engine Programming (3dgep.com)

     이 그림이 DirectX 12의 각 단계의 흐름을 나타냅니다. 파란 사각형 블록은 프로그래밍을 통해 손을 댈 수 없는 단계를 뜻합니다. 녹색의 둥근 사각형이 그래픽 파이프라인의 단계 중에서 프로그래밍이 가능항 부분을 나타냅니다. ( 잘 보면 손을 댈 수 있는 부분은 'Shader'라는 이름이 붙는다는 사실을 눈치챌 수 있습니다 )

     

    Input-Assembler Stage

     

    그래픽 파이프 라인의 첫 단계는 Input-Assembler Stage(IA stage)입니다. 이 단계의 목적은 사용자가 정의한 버퍼[buffer]들을 조합하여 Primitive로 만들어 다른 그래픽 파이프라인에서 사용할 수 있도록 준비하는 것입니다. 

    Primitive? 

    별 대단한 말은 아닙니다. 기본적인 정의는 더 작은 상태로 쪼개거나 분해할 수 없는 '무언가' 또는 기하학적인 형태를 이르는 말입니다. 몇 가지 기본적인 타입이 존재하는데 Point List, Line List, Line Strip, Triangle List, Triangle Strip 등이 있습니다.  

    Primitive의 타입에 대해서 조금 더 자세히 알아보면 Point List를 제외하고 Adjacency를 갖는 Primitive, 또 갖지 않는 것으로 두 종류가 있습니다. Direct3D 10 이상에선 지원되는 기능이기 때문에 DirectX 12에서도 적용되는 말일 것입니다. Adjacency를 갖는 Primitive들은 그것을 둘러싸고 있는 Vertex를 추가적으로 갖고 있는 반면 Adjacency가 없는 Primitive들은 딱 Vertex만 갖고 있습니다. 이 Adjacency는 Geometry Shader를 위해 마련된 것이며 실루엣, 그림자 등을 작업하는데 유용하게 활용됩니다. 더 자세한 사항은 MSDN의 문서를 참고하는 편이 낫습니다.

    Vertex Shader Stage

     

    Vertex Shader 단계는 ( VS stage ) IA 단계에서 데이터를 넘겨받으며 Transformation, Skinning, Morphing, Per-Vertex Lighting 등의 Per-Vertex 작업을 수행합니다. 주의할 점이 있는데 VS 단계는 언제나 하나의 Input vertex에 대해서만 동작하며 단 하나의 output vertex를 만들어 낸다는 것입니다. 이 단계는 그래픽 파이프 라인에서 필수적이며 언제나 활성화 된 상태여야만 합니다. Vertex Shader를 통해 별다른 일을 하지 않더라도 그래픽 파이프라인에 반드시 있어야 합니다.

     

    Hull Shader Stage

     

    Hull Shader 단계 ( HS Stage )는 옵션이며 총 세 가지 단계 중 Tessellation을 구성하는 첫 번째 역할을 합니다. Tessellator, Domain Shader와 함께 세 단계가 'Tessellation'을 구성하는 단계들입니다. Hull Shader는 크게 두 가지의 함수를 요구하는데 하나는 Main Hull Shader이고 다른 하나는 Patch Constant Function입니다. 

     

    Tessellation Stages

     

    DirectX 11부터 Tessellation을 위해 새롭게 추가된 세 가지의 단계를 묶어서 이르는 말입니다. GPU에서 low-detail한 Subdivision Surface를 High-Detail Subdivision으로 변환할 수 있도록 하는 역할을 합니다.

     

    Tessellation Stage :: Hull Shader

    이 단계는 Shader들과는 다르게 고정된 단계[Fixed-Function Stage]로서 Hull Shader Stage에서 정의된 대로 patch primitive들을 더 작은 primitive로 나누는 단계입니다. 모든 것들이 이전(以前)단계인 Hull Shader로부터 전해받기 때문에 Hull Shader단계가 초기화 혹은 촉발[Initialised]되면 이 단계도 자동적으로 초기화됩니다. 

     

    Tessellation Stage :: Domain Shader Stage

     

    Domain Shader 단계 ( DS Stage )역시 선택적인 Shader 단계입니다. 이 단계는 Hull Shader로부터 나온 Control Points들을 바탕으로 최종 Vertex Attributes를 계산하며 Tessellator 단계로부터 나온 좌표[Coordinates]들을 삽입(또는 합산)합니다. Domain Shader의 input은 Tessllator 단계에서 온 Single output point ( UVW Coordinates )이며 이 Output은 계산된 Tessellated Primitive입니다. 

     

    Tessellation Stage :: Geometry Shader Stage

     

    Geometry Shader 단계 ( GS Stage )는 하나의 Geometric Primitive( 점 Primitive를 위한 하나의 Vertex, 삼각형 Primitive를 위한 세 개의 Vertices, 선 Primitive를 위한 두 개의 Vertices 등 )만을 인풋으로 받으며 다른 Primitive로 변환하거나 제거, 생성하는 등의 기능을 수행하는 부가적인 단계입니다. 

     

    Stream Output Stage

     

    Stream Output ( SO Stage ) 단계는 GPU 메모리에 정보들을 넘겨주는 고정된 부가적인 단계입니다. 이렇게 넘겨진 데이터들은 다른 Shader에 의해 처리될 수 있도록 다시 렌더링 파이프라인에 실을 수 있습니다. 이건 입자 효과 ( Particle Effect )를 생성하거나 제거하는데 유용하게 활용됩니다. Geometry Shader에서 이 입자효과를 생성하거나 제거할 수 있습니다. 

     

    Rasteriser Stage

     

    Rasteriser Stage ( RS Stage )는 고정된 단계이며 생성된 Primitive들을 View Frustum에 들어갈 수 있도록 변환하거나 Culling하는 역할을 합니다. Culling은 물론 Front-face/Back-face Culling이 활성화 된 상태여야 합니다. 또, 이 단계에서 Per-Vertex들을 의도된 대로 Primitive들의 표면에 바르고 이렇게 합쳐진 값을 Pixel Shader로 넘겨줍니다.

     

    Pixel Shader Stage

     

    Pixel Shader Stage ( PS Stage )는 RS 단계에서 Per-vertex자료들을 넘겨받고 Per-Pixel colour value를 생성합니다. Pixel Shader는 Single Component 32-bit floating-point value를 SV_Depth Semantic에 맵핑함으로써 현재 픽셀의 깊이 값[Depth value]을 출력할 수 있는 옵션이 있지만 이 기능은 Pixel Shader Programme의 필수적인 기능은 아닙니다. Pixel Shader는 Primitive로 둘러싸인 모든 Pixel에 대해서 발동합니다.

     

    Output-Merge Stage

     

    Output-Merge Stage ( OM )단계는 pixel shader, depth value, stencil information 등을 조합하여 최종적인 파이프라인의 완성된 데이터를 만들어냅니다. 

    'DirectX' 카테고리의 다른 글

    [ DirectX 12 ] - DirectX API  (0) 2021.05.15
    [ DirectX 12 ] - Introduction  (0) 2021.05.15
Designed by Tistory.