차근차근 꾸준히

한 눈에 알기 쉽게 정리하자

프로그래밍/DirectX 11

[DX11] 그래픽 파이프라인에 대해 알아보자

shintesh 2025. 1. 14. 15:01

참고

 

그래픽 파이프라인 - Win32 apps

이 섹션에서는 Direct3D 11 프로그래밍 가능 파이프라인에 대해 설명합니다.

learn.microsoft.com

 

마소에 나와있는 정보글을 필자가 보기 편하도록 정리한 글이자, 학습을 위해 읽으면서 쓴 글입니다.
마소의 정리글은 수정될 수도 있으므로 제 글보단 마소 글을 보는 걸 더 추천합니다.

참고로, 링크 중에 마소 홈으로 가지는 경우도 있는데 걍 연결된 곳이 사라진 겁니다. 마소 글에 있는 링크도 안되어있는게 꽤 많아요.


 

 

총 10개의 스테이지로 구성되어있다.

 

Hull Shader, Domain Shader 단계는 테셀레이션 단계에 포함된다.

[목차]

1. Input-Assembler Stage(입력 어셈블러 : IA 단계)

목적 : 사용자가 채운 버퍼에서 기본 데이터(점, 선 및/또는 삼각형)를 읽고 다른 파이프라인 단계에서 사용할 기본 형식으로 데이터를 어셈블하는 것입니다.

 

IA 단계는 여러 기본 형식(선 목록(목록은 리스트라고 보면된다), 삼각형 스트립 또는 인접한 원형 등)에 꼭짓점을 조합할 수 있습니다.

 

기하 도형 셰이더(geometry shader)를 지원하기 위해 새로운 기본 형식(예: 인접(adjacency)한 선 목록 또는 인접한 삼각형 목록)이 있습니다.

인접 정보는 기하 도형 셰이더의 애플리케이션에서만 볼 수 있습니다.

  • 예를 들어 인접성을 포함한 삼각형으로 기하 도형 셰이더가 호출된 경우 입력 데이터에는 삼각형 하나에 해당하는 3개의 꼭짓점, 삼각형의 인접 데이터에 해당하는 3개의 꼭짓점이 포함될 것입니다.

인접 데이터를 출력하기 위해 입력 어셈블러 단계가 요청되면 입력 데이터에 인접 데이터가 포함되어야 합니다.

그러려면 더미 꼭짓점(중복 제거 삼각형 형성)을 제공하거나 경우에 따라 꼭짓점(vertex)의 존재 여부를 나타내는 꼭짓점 속성 중 하나에 플래그를 지정해야 할 수도 있습니다.

 

래스터라이저 단계에 중복 제거 기하 도형의 컬링이 발생하더라도 이 역시 기하 도형 셰이더에서 발견하고 처리해야 합니다.

  • 래스터라이저 단계란(rasterizer stage)? : 벡터 정보(형태 또는 기본 요소로 구성)를 래스터 이미지(픽셀로 구성)로 변환하는 단계

기본 형식을 어셈블하는 동안 IA의 보조 목적은 시스템 생성 값을 연결하여 셰이더의 효율성을 높이는 것입니다.

세 셰이더 단계(버텍스, 지오메트리, 픽셀 셰이더)는 모두 공통 셰이더 코어에서 생성되며 셰이더 코어는 시스템 생성 값(예: 기본 ID, instance ID 또는 꼭짓점 ID)을 사용하여 셰이더 단계가 아직 처리되지 않은 기본 요소, 인스턴스 또는 꼭짓점으로만 처리를 줄일 수 있도록 합니다.

 

 


 

2. Vertex Shader Stage(꼭짓점 셰이더 : VS 단계)

 

목적 : 입력 어셈블러의 꼭짓점을 처리하여 변환, 스키닝, 모핑 및 꼭짓점별 조명과 같은 꼭짓점별 작업을 수행합니다.

  • Vertex : 주로 정점이라고 해석하지만, 이 문서에선 꼭짓점으로 주로 변역되므로 꼭짓점으로 두겠다.

꼭짓점 셰이더는 항상 단일 입력 꼭짓점에서 작동하여 단일 출력 꼭짓점을 생성합니다.

파이프라인이 실행되려면 꼭짓점 셰이더 단계가 항상 활성화되어 있어야 합니다.

  • 꼭짓점 수정이나 변환이 필요하지 않은 경우 통과 꼭짓점 셰이더를 작성하고 파이프라인으로 설정해야 합니다.

각 꼭짓점 셰이더 입력 꼭짓점최대 16개의 32비트 벡터(각각 최대 4개의 구성 요소)로 구성될 수 있으며 각 출력 꼭짓점은 최대 16개의 32비트 4개 구성 요소 벡터로 구성될 수 있습니다.

모든 꼭짓점 셰이더는 하나 이상의 입력과 하나의 출력이 있어야 하며, 이는 스칼라 값 하나만큼 적을 수 있습니다.

 

꼭짓점 셰이더 단계에서는 입력 어셈블러에서 생성된 두 개의 시스템 생성 값인 VertexID 및 InstanceID를 사용할 수

(시스템 값 의미 체계 참조)

  • VertexID와 InstanceID는 모두 꼭짓점 수준에서 의미를 갖고, 하드웨어에서 생성한 ID는 이 값을 이해하는 첫 번째 단계에만 제공할 수 있습니다. 따라서 이러한 ID 값은 꼭짓점 셰이더 단계에만 제공할 수 있습니다.

꼭짓점 셰이더는 항상 인접한 입력 기본 토폴로지(primitive topologies)의 인접 꼭짓점을 비롯한 모든 꼭짓점에서 실행됩니다.

버텍스 셰이더가 실행된 횟수는 VSInvocations 파이프라인 통계를 사용하여 CPU에서 쿼리할 수 있습니다.

  • primitive(프리미티브)란? : 점 3개 이상으로, 면을 구성할 수 있는 기본 도형을 말하는 것 같다.
    주로 번역이 기본 도형 or 원형 or 기본 요소 로 되므로 주의하자.
  • primitive topology : 직역하면 기본 도형 위상 구조이다. DX11에게 기본 도형을 형성하는 방법을 알려주려면 이를 설정해야하는 것이라고 생각된다.
  • topology(토폴로지) : 직역하면 위상이다. 어떤 사물이 다른 사물과의 관계 속에서 가지는 위치나 양상을 얘기한다.
    쉽게 말해서 위치와 형태를 의미하는 것 같다.

 

꼭짓점 셰이더는 화면 공간 파생(screen-space derivatives)이 필요하지 않은 경우 로드 및 텍스처 샘플링 작업을 수행할 수 있습니다.

(HLSL 내장 함수 사용: 샘플(DirectX HLSL 텍스처 개체)SampleCmpLevelZero(DirectX HLSL 텍스처 개체)SampleGrad(DirectX HLSL 텍스처 개체))

 


 

3. Tessellation Stage(테셀레이션 단계)

Tessellation : 직역하면 모자이크식 포장이라고 한다. 주로 공간 분할이라고 직역된다.

 

Direct3D 11 런타임은 GPU에서 저 세부도 분할 표면을 고 세부도 primitives으로 변환하는 테셀레이션을 구현하는 새로운 세 단계를 지원합니다. 테셀레이션은 고차 표면을 렌더링에 적합한 구조로 타일링(또는 분할)합니다.

 

그래픽 파이프라인은 하드웨어에서 공간 분할을 구현하여 하위 세부도(다각형 수가 적음) 모델을 평가하고 상위 세부도로 렌더링할 수 있습니다. 소프트웨어 공간 분할이 가능하지만 하드웨어에서 구현된 공간 분할은 모델 크기에 시각적 세부 정보를 추가하고 새로 고침 빈도를 마비시키지 않고 놀라울 정도의 시각적 세부 정보를 생성할 수 있습니다(변위 매핑에 대한 지원 포함).

 

테셀레이션 장점(쓰면 성능 굿~):

  • 메모리와 대역폭을 많이 절약하여 애플리케이션이 저해상도 모델에서 더 자세한 표면을 렌더링할 수 있습니다. Direct3D 11 파이프라인에서 구현된 공간 분리 기술은 변위 매핑도 지원하므로 엄청난 양의 표면 세부 정보를 생성할 수 있습니다.
  • 즉석에서 계산할 수 있는 연속 또는 뷰 종속 세부 수준과 같은 확장 가능한 렌더링 기술을 지원합니다.
  • 낮은 빈도로 값비싼 계산을 수행하여 성능을 향상시킵니다(하위 세부 모델에서 계산 수행). 여기에는 사실적 애니메이션을 위한 혼합 형태 또는 모프 대상을 사용한 혼합 계산이나 충돌 탐지 또는 연체 역학을 위한 물리 계산이 포함될 수 있습니다.

Direct3D 11 파이프라인은 하드웨어에서 테셀레이션을 구현하여 CPU에서 GPU로 작업을 오프로드합니다.
그러므로 애플리케이션이 많은 수의 모프 대상 및/또는 보다 정교한 스킨 지정/변형 모델을 구현하는 경우 성능이 현저히 개선될 수 있습니다.

  • Morph Target (모프 타깃)이란? : 3D 컴퓨터 애니메이션에서 변형된 메시의 정점 위치를 기록한 스냅샷입니다. 모프 타겟 애니메이션은 골격 애니메이션과 함께 사용되며, 정점당 애니메이션, 모양 보간, 모양 키, 블렌드 모양 등이라고도 불립니다. 예를 들어 캐릭터 모델을 선택하여, 그 얼굴 모양을 바꿔 얼굴 표정을 만든 다음, 그 수정된 버전을 모프 타깃으로 저장합니다.
  • 언리얼에서는 그 모프 타깃으로 블렌딩하여, 캐릭터의 얼굴이 그 표정을 짓도록 만들 수 있습니다. 모프 타깃은 FBX 를 통해 언리얼로 임포트되며, 애니메이션 시퀀스 안에서 캡슐화됩니다.

새 테셀레이션 기능에 액세스하려면 몇 가지 새로운 파이프라인 단계에 대해 알아보아야 합니다.

  • Hull Shader(헐 셰이더) 단계 - 각 입력 패치(쿼드, 삼각형 또는 선)에 해당하는 기하 도형 패치(및 패치 상수)를 생성하는 프로그래밍 가능한 셰이더 단계입니다.
  • Tessellator(테셀레이터) 단계 - 기하 도형 패치를 나타내는 도메인의 샘플링 패턴을 만들고 이러한 샘플을 연결하는 더 작은 개체(삼각형, 점 또는 선) 집합을 생성하는 고정 함수 파이프라인 단계입니다.
  • Domain Shader(도메인 셰이더) 단계 - 각 도메인 샘플에 해당하는 꼭짓점 위치를 계산하는 프로그래밍 가능한 셰이더 단계입니다.

 


 

4. Geometry Shader Stage(기하 도형 셰이더 단계)

GS(geometry-shader) 단계는 꼭짓점을 입력으로 사용하고 출력에서 꼭짓점을 생성하는 기능을 사용하여 애플리케이션에서 지정한 셰이더 코드를 실행합니다.

단일 꼭짓점에서 작동하는 꼭짓점 셰이더와 달리 기하 도형 셰이더의 입력은 전체 기본 형식의 꼭짓점입니다(선의 경우 꼭짓점 2개, 삼각형의 경우 꼭짓점 3개 또는 점의 경우 단일 꼭짓점). 기하 도형 셰이더는 에지 인접 기본 형식에 대한 꼭짓점 데이터를 입력으로 가져올 수도 있습니다(선에 대한 꼭짓점 2개, 삼각형의 경우 3개 추가). 다음 그림에서는 삼각형과 인접한 꼭짓점이 있는 선을 보여 줍니다.

삼각형에 인접 꼭짓점 3개와 선에 인접 꼭짓점 2개가 보인다.

TV Triangle Vertex
AV Adjacent Vertex
LV Line Vertex
  • Adjacent : 인접한

기하 도형 셰이더 단계에서는 IA에서 자동으로 생성되는 SV_PrimitiveID 시스템 생성 값을 사용할 수 있습니다. 이를 통해 원할 경우 기본 요소별 데이터를 가져오거나 계산할 수 있습니다.

 

geometry-shader 단계는 선택한 단일 토폴로지를 형성하는 여러 꼭짓점을 출력할 수 있습니다(사용할 수 있는 GS 단계 출력 토폴로지는 tristrip, linetrip 및 pointlist).
내보내는 기본 요소의 숫자는 기하 도형 셰이더 호출마다 자유롭게 변할 수 있으나, 내보낼 수 있는 최대 꼭짓점의 수는 고정적으로 선언될 수 있습니다.
기하 도형 셰이더 호출에서 내보내는 스트립 길이는 임의의 길이가 될 수 있으며, 새 스트립은 
RestartStrip HLSL 함수를 통해 만들 수 있습니다.

 

 

기하 도형 셰이더가 활성화되면 파이프라인에 전달되었거나 이전에 생성된 모든 기본 요소에 대해 호출됩니다.
기하 도형 셰이더는 호출될 때마다 호출 기본 요소가 한 점, 한 선, 한 삼각형이든 상관없이 이에 대한 데이터를 입력으로 봅니다.

  • 파이프라인에 전에 삼각형 스트립이 있으면 스트립의 각 개별 삼각형에 대해 기하 도형 셰이더가 호출됩니다.
    스트립이 삼각형 목록으로 확장된 것과 같습니다.
  • 개별 기본 형식의 각 꼭짓점의 모든 입력 데이터(예: 삼각형의 경우 3개 꼭짓점)와 인접한 꼭짓점 데이터(해당/사용 가능한 경우)를 사용할 수 있습니다.

 

기하 도형 셰이더는 꼭짓점을 출력 스트림 개체에 추가하는 방식으로 한 번에 하나의 꼭짓점을 출력합니다.

스트림의 토폴로지는 고정된 선언에 의해 결정되며, GS 단계의 출력으로 PointStream, LineStream 또는 TriangleStream 중 하나를 선택합니다.

사용할 수 있는 스트림 개체에는 모두 템플릿이 있는 개체인 PointStream, LineStream 및 TriangleStream의 세 가지 유형이 있습니다.

출력의 토폴로지는 해당하는 개체 유형에 따라 결정되며, 스트림에 추가되는 꼭짓점의 형식은 템플릿 유형에 따라 결정됩니다.

기하 도형 셰이더 인스턴스의 실행은 스트림에 추가된 데이터가 직렬인 경우를 제외하고 다른 호출과 별개입니다.

기하 도형 셰이더의 지정된 출력은 다른 호출에 독립적(순서는 존중됨)입니다.

삼각형 스트립을 생성하는 기하 도형 셰이더는 모든 호출 시 새 스트립을 시작합니다.

 

(지금은 어떤 얘기인지 감이 안잡힌다.)

 

기하 도형 셰이더 출력이 시스템 해석 값(예: SV_RenderTargetArrayIndex 또는 SV_Position)으로 식별되면 하드웨어는 이 데이터를 살펴보고 값에 따라 일부 동작을 수행하며, 입력을 위해 데이터 자체를 다음 셰이더 단계로 전달할 수 있습니다.

기하 도형 셰이더의 특정 데이터 출력이 하드웨어에 꼭짓점별 기반(SV_ClipDistance[n] 또는 SV_Position 등)이 아닌 기본 요소별 기반(SV_RenderTargetArrayIndex 또는 SV_ViewportArrayIndex)의 의미를 가지는 경우, 기본 요소별 데이터는 기본 요소에서 내보내는 선행 꼭짓점(leading vertex)에서 가져옵니다.

 

기하 도형 셰이더가 종료되고 기본 요소가 완성되지 않은 경우, 기하 도형 셰이더에서 부분적으로 완료된 기본 요소를 생성할 수 있습니다.

완전하지 않은 기본 요소는 자동으로 삭제됩니다.

이는 IA가 부분적으로 완료된 기본 요소를 처리하는 방법과 비슷합니다.

기하 도형 셰이더는 화면 공간 파생 항목(screen-space derivatives)이 필요하지 않은 경우 로드 및 질감 샘플링 작업(samplelevel, samplecmplevelzero, samplegrad)을 수행할 수 있습니다.

  • screen-space derivatives : 특정 값이 하나의 프래그먼트(스크린 픽셀)에서 어떻게 변화하는지를 나타내는 값
    이라곤 하는데... 실습 시에 어떤 녀석인지 알아봐야 된다.

기하 도형 셰이더에서 구현할 수 있는 알고리즘은 다음과 같습니다.

  • 점 스프라이트 확장
  • 동적 입자(Particle : 파티클) 시스템
  • 털/핀(fur/fin) 생성
  • 섀도우 볼륨 생성
  • 단일 패스 큐브 맵으로 렌더링
  • 기본 요소별 재질(material) 바꾸기
  • Per-Primitive 재질 설정 - 픽셀 셰이더가 사용자 지정 특성 보간을 수행할 수 있도록 기본 데이터로 바리센트릭 좌표 생성을 포함합니다(더 높은 순서의 일반 보간 예는 CubeMapGS 샘플 참조).

 


 

5. Stream-Output Stage(스트림 출력 : SO 단계)

목적 : geometry-shader 단계(또는 geometry-shader 단계가 비활성 상태인 경우 꼭짓점 셰이더 단계)에서 메모리의 하나 이상의 버퍼로 꼭짓점 데이터를 지속적으로 출력(또는 스트림)하는 것입니다(Stream-Output 스테이지를 사용한 시작 참조).

 

SO(스트림 출력 단계)는 다음 다이어그램과 같이 기하 도형 셰이더 단계 바로 뒤와 래스터화 단계 바로 앞에 있는 파이프라인에 있습니다.

 

메모리로 스트리밍된 데이터는 이후의 렌더링 패스에서 파이프라인으로 다시 입력되거나 (CPU에서 읽을 수 있도록) 준비 리소스로 복사될 수 있습니다.

스트리밍되는 데이터의 양은 다를 수 있습니다. ID3D11DeviceContext::D rawAuto API는 기록된 데이터의 양에 대해 쿼리(GPU)할 필요 없이 데이터를 처리하도록 설계되었습니다.

삼각형 또는 선 스트립입력 어셈블러 단계에 바인딩되면 각 스트립이 스트리밍되기 전에 목록으로 변환됩니다.

꼭짓점항상 완전한 기본 형식으로 작성됩니다(예: 삼각형의 경우 한 번에 3개의 꼭짓점).

불완전한 기본 형식은 스트리밍되지 않습니다.

인접한 기본 형식은 데이터를 스트리밍하기 전에 인접 데이터를 삭제합니다.

 

파이프라인에 스트림 출력 데이터를 공급하는 방법은 두 가지가 있습니다.

  • 스트림 출력 데이터는 입력 어셈블러 단계다시 공급될 수 있습니다.
  • 스트림 출력 데이터는 로드 함수(예: Load)를 사용하여 프로그래밍 가능한 셰이더에서 읽을 수 있습니다.

버퍼를 스트림 출력 리소스사용하려면 D3D11_BIND_STREAM_OUTPUT 플래그를 사용하여 버퍼를 만듭니다.

스트림 출력 단계는 최대 4개의 버퍼를 동시에 지원합니다.

  • 데이터를 여러 버퍼로 스트리밍하는 경우 각 버퍼는 암시된 데이터 진행 속도가 각 버퍼 내 요소 너비와 동일한(단일 요소 버퍼가 입력에 대해 셰이더 단계로 바인딩되는 방식과 호환됨), 꼭짓점당 데이터의 단일 요소(최대 4개 구성 요소)만 캡처할 수 있습니다. 또한 버퍼 크기가 서로 다를 경우 버퍼 중 하나가 가득 차는 즉시 쓰기가 중단됩니다.
  • 데이터를 단일 버퍼로 스트리밍하는 경우 버퍼는 꼭짓점당 데이터(256바이트 이하)의 스칼라 구성 요소를 최대 64개 캡처할 수 있거나 꼭짓점 진행 속도가 최대 2048바이트일 수 있습니다.

 


 

6. Rasterizer Stage(래스터라이저 단계)

래스터화 단계는 실시간 3D 그래픽을 표시하기 위해 벡터 정보(형태 또는 기본 요소로 구성)를 래스터 이미지(픽셀로 구성)로 변환합니다.

 

래스터화 동안 각 기본 요소는 픽셀로 변환되며 각 기본 요소에 걸쳐 꼭짓점별 값을 보간합니다.

래스터화에는 시야 절두체로 꼭짓점 클리핑, z로 나누기 수행을 통한 원근 제공, 기본 요소를 2D 뷰포트로 매핑, 픽셀 셰이더 호출 방법 결정이 포함됩니다.

픽셀 셰이더 사용은 선택적이지만 래스터라이저 단계는 항상 클리핑, 원근 분할을 수행하여 점을 같은 공간으로 변환하고, 꼭짓점을 뷰포트에 매핑합니다.

래스터라이저 단계로 들어오는 꼭짓점(x,y,z,w)은 같은 유형의 클립 공간에 있는 것으로 간주됩니다. 이 좌표 공간에서 X축은 오른쪽, Y축은 위쪽, Z축은 카메라에서 먼 쪽을 가리킵니다.

 

 

실습 얘기

  • 파이프라인에 픽셀 셰이더가 없다고 말하고(ID3D11DeviceContext::P SSetShader를 사용하여 픽셀 셰이더 단계를 NULL로 설정) 깊이 및 스텐실 테스트를 사용하지 않도록 설정하여 래스터화를 사용하지 않도록 설정할 수 있습니다.
  • 계층적 Z 버퍼 최적화를 구현하는 하드웨어에서는 깊이 및 스텐실 테스트를 사용하도록 설정하면서 픽셀 셰이더 단계를 NULL 로 설정하여 z 버퍼를 미리 로드할 수 있습니다.

 


 

7. Pixel Shader Stage(픽셀 셰이더 : PS 단계)

PS(픽셀 셰이더 단계)를 사용하면 픽셀별 조명 및 후처리와 같은 풍부한 음영 기술을 사용할 수 있습니다.

픽셀 셰이더는 상수, 텍스처 데이터, 보간된 꼭짓점별 값 및 기타 데이터를 조합하여 픽셀별 출력을 산출하는 프로그램입니다.

래스터라이저 단계는 기본형으로 적용되는 각 픽셀에 대해 픽셀 셰이더를 한 번 호출합니다.

그러나 셰이더를 실행하지 않도록 NULL 셰이더를 지정할 수 있습니다.

 

텍스처를 다중 샘플링할 때는 포함된 픽셀당 한 번 픽셀 셰이더가 호출되며, 포함된 각각의 다중 샘플에 대해 깊이/스텐실 테스트가 이루어집니다.

깊이/스텐실 테스트를 통과하는 샘플은 픽셀 셰이더 출력 색으로 업데이트됩니다.

 

픽셀 셰이더 내장 함수는 화면 공간 x와 y를 기준으로 수량 파생 항목(derivatives of quantities)을 만들거나 사용합니다.

파생 항목의 가장 흔한 용도는 텍스처 샘플링을 위한 LOD(level-of-detail) 계산을 하고, 이방성 필터링의 경우에는 이방성 축을 따라 샘플을 선택하는 것입니다.

일반적으로 하드웨어 구현은 여러 픽셀(예: 2x2 그리드)에서 동시에 하나의 픽셀 셰이더를 실행하므로 픽셀 셰이더에서 계산되는 수량 파생 항목은 인접 픽셀의 동일한 실행 지점에서 값의 델타로 합리적으로 어림잡을 수 있습니다.

 

이방성 필터링의 특징

  • 빗각에 놓인 표면의 질감을 강화
  • 원근감을 고려하여 텍스처를 수정
  • 직선으로 텍스처를 볼 때보다 비스듬한 각도에서 봤을 때 품질을 개선
  • 게임에서 먼 거리에 있는 오브젝트의 그래픽 퀄리티를 개선하는 데 도움이 된다.

 

입력

파이프라인이 기하 도형 셰이더 없이 구성된 경우, 픽셀 셰이더는 16, 32비트, 4-구성 요소 입력으로 제한됩니다. 그렇지 않은 경우, 픽셀 셰이더는 최대 32, 32비트, 4-구성 요소 입력을 취할 수 있습니다.

 

픽셀 셰이더 입력 데이터는 꼭짓점 특성(원근 수정을 포함하거나 원근 수정 없이 보간 가능)을 포함하거나 기본 요소별 상수로 취급할 수 있습니다.

픽셀 셰이더 입력은 선언된 보간 모드에 따라 래스터화되는 기본 요소의 꼭짓점 특성으로부터 보간됩니다.

래스터화 전에 기본 요소가 잘리는 경우, 클리핑(clipping) 프로세스 도중에도 보간 모드가 적용됩니다.

 

꼭짓점 특성은 픽셀 셰이더 중앙 위치에서 보간(또는 평가)됩니다.

픽셀 셰이더 속성 보간 모드는 인수 또는 입력 구조로 입력 등록 선언에서 요소별로 선언됩니다.

특성은 선형으로 보간되거나 중심 샘플링으로 보간될 수 있습니다.

중심 평가는 기본 요소에 픽셀이 포함되지만 픽셀 중심은 포함되지 않을 수 있는 경우를 포함하기 위해 다중 샘플링 도중에만 관련됩니다.

중심 평가는 (비포함) 픽셀 중심에 최대한 가까이서 이루어집니다.

 

입력은 다른 파이프라인 단계에서 사용되는 매개 변수를 표시하는 시스템 값 시맨틱을 사용하여 선언될 수도 있습니다.

예를 들어 픽셀 위치는 SV_Position 시맨틱으로 표시되어야 합니다.

IA 단계는 픽셀 셰이더에 대해 하나의 스칼라를 생성할 수 있습니다(SV_PrimitiveID 사용).

래스터라이저 단계는 픽셀 셰이더에 대해 하나의 스칼라를 생성할 수도 있습니다(SV_IsFrontFace 사용).

  • Semantic(시맨틱) : 의미체계

출력

픽셀 셰이더는 최대 8, 32비트, 4-구성 요소 색을 출력할 수 있습니다.

픽셀이 삭제된 경우에는 아무 색도 출력하지 않습니다.

픽셀 셰이더 출력 등록 구성 요소는 사용하기 전에 선언되어야 합니다.

각 등록에는 고유의 출력 쓰기 마스크가 허용됩니다.

 

깊이-쓰기 사용 상태(출력 병합기 단계)를 사용하여 깊이 데이터가 깊이 버퍼에 기록되는지 또는 삭제 명령을 사용하여 해당 픽셀에 대한 데이터를 삭제할지 여부를 제어합니다.

픽셀 셰이더는 깊이 테스트를 위해 옵션인 32비트, 1-구성 요소, 부동 소수점 깊이 값도 출력할 수 있습니다(SV_Depth 시맨틱 사용).

깊이 값은 oDepth 등록에서 출력되며, 깊이 테스트의 보간된 깊이 값을 대체합니다(깊이 테스트가 활성화 되어 있다고 가정).

고정 함수 깊이 사용 또는 oDepth 사용 사이에서 동적으로 전환하는 방법은 없습니다.

픽셀 셰이더는 스텐실 값을 출력할 수 없습니다.

 

8. Output-Merger Stage(출력 병합기 : OM 단계)

OM(출력 병합기) 단계는 파이프라인 상태, 픽셀 셰이더에서 생성된 픽셀 데이터, 렌더링 대상내용깊이/스텐실 버퍼의 내용을 조합하여 최종 렌더링된 픽셀 색을 생성합니다.

OM 단계는 표시되는 픽셀(깊이 스텐실 테스트 포함)을 결정하고 최종 픽셀 색을 혼합하기 위한 마지막 단계입니다.

 

Depth-Stencil 테스트 개요

질감 리소스로 생성되는 깊이 스텐실 버퍼깊이 데이터스텐실 데이터를 모두 포함할 수 있습니다.

  • 깊이(Depth): 각 픽셀의 깊이(Z-값)를 저장하여 객체의 앞뒤 관계를 처리.
  • 스텐실(Stencil): 특정 영역의 렌더링을 제어하거나 마스킹. 특정 픽셀에만 그리기를 제한할 수 있는 버퍼
    • 후면 버퍼에 그릴지 말지를 판정하는 스텐실 판정을 수행합니다.
    • 깊이(depth)와 스텐실 버퍼를 사용하여 시각적 효과를 향상시킵니다. 

깊이 데이터는 카메라에 가장 가까운 픽셀을 결정하는 데 사용되고, 스텐실 데이터는 업데이트할 수 있는 픽셀을 마스크하는 데 사용됩니다.

결국 출력 병합기 단계는 깊이 값과 스텐실 값을 모두 사용하여 픽셀을 그려야 하는지 여부를 결정합니다.

다음 다이어그램에서는 깊이 스텐실 테스트를 수행하는 방법을 개념적으로 보여 줍니다.

깊이 스텐실 테스트를 구성하려면 깊이 스텐실 기능 구성을 참조하세요.

깊이 스텐실 개체는 깊이 스텐실 상태를 캡슐화합니다.

애플리케이션이 깊이 스텐실 상태를 지정할 수 있으며 그렇지 않을 경우, OM 단계는 기본값을 사용합니다.

다중 샘플링이 사용하지 않도록 설정된 경우 픽셀별 혼합 연산이 수행됩니다.

다중 샘플링이 사용하도록 설정된 경우 다중 샘플별 혼합이 이루어집니다.

 

깊이 버퍼를 사용하여 어떤 픽셀을 그릴지 결정하는 프로세스를 깊이 버퍼링이라고 하며, 경우에 따라 z 버퍼링이라고도 합니다.

 

깊이 값이 출력 병합기 단계에 도달하면(깊이 값이 보간에서 발생하건 픽셀 셰이더에서 발생하건 상관없이) 깊이 값은 깊이 버퍼의 형식/정확도에 따라 부동 소수점 규칙을 사용하여 항상 고정됩니다.

z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) 고정 후 기본 깊이 버퍼 값을 기준으로 깊이 값을 비교합니다(DepthFunc 사용).

바인딩된 깊이 버퍼가 없으면 깊이 테스트는 항상 통과됩니다.

 

 

깊이 버퍼 형식에 스텐실 구성 요소가 없거나 바인딩된 깊이 버퍼가 없는 경우에는 스텐실 테스트가 항상 통과됩니다.

그렇지 않으면 기능이 Direct3D 9에서 변경되지 않습니다.

 

한 번에 하나의 깊이/스텐실 버퍼만 활성화될 수 있습니다.

바인딩된 리소스 보기는 깊이/스텐실 보기와 일치해야 합니다(같은 크기와 치수).

이것은 리소스 크기가 아니라 보기 크기가 일치해야 함을 뜻합니다.

 

깊이 스텐실 테스트에 대한 자세한 내용은 자습서 14를 참조하세요.

 

 

혼합 개요

혼합은 하나 이상의 픽셀 값을 조합하여 최종 픽셀 색을 만듭니다.

다음 다이어그램에서는 픽셀 데이터 혼합에 관련된 프로세스를 보여 줍니다.

modulate : 조정하다

개념적으로 출력 병합기 단계에서 두 번 구현된 이 흐름 차트를 시각화할 수 있습니다.

첫 번째 흐름 차트는 RGB 데이터를 혼합하고 두 번째 흐름 차트는 알파 데이터를 혼합합니다.

API를 사용하여 혼합 상태를 만들고 설정하는 방법은 혼합 기능 구성을 참조하세요.

 

(이 아래부턴 아직 감이 오지 않는다.)

 

고정 기능 혼합은 각 렌더링 대상에 대해 독립적으로 사용하도록 설정할 수 있습니다.

그러나 혼합 컨트롤 세트가 하나뿐이므로 혼합이 사용하도록 설정된 모든 RenderTarget에 동일한 혼합이 적용됩니다.

혼합 값(BlendFactor 포함)은 항상 혼합 전에 렌더링-대상 형식 범위에 고정됩니다.

고정은 렌더링 대상별로 이루어지며 렌더링 대상 유형을 사용합니다.

유일한 예외는 고정되지 않는 float16, float11 또는 float10 형식으로서 이 형식의 혼합 연산은 출력 형식과 적어도 동일한 정확도/범위로 수행될 수 있습니다.

모든 경우(0.0 혼합 가중치 포함)에 NaN과 서명된 0이 전파됩니다.

 

Dual-Source 색 혼합

이 기능을 사용하면 출력 병합기 단계에서 두 픽셀 셰이더 출력(o0 및 o1)을 슬롯 0의 단일 렌더링 대상과 혼합 작업에 대한 입력으로 동시에 사용할 수 있습니다.

유효한 혼합 연산에는 add, subtract, revsubtract가 포함됩니다.

SrcBlend, DestBlend, SrcBlendAlpha 또는 DestBlendAlpha에 대한 유효한 혼합 옵션은 D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLORD3D11_BLEND_SRC1_ALPHAD3D11_BLEND_INV_SRC1_ALPHA 포함합니다.

혼합 수식과 출력 쓰기 마스크는 픽셀 셰이더가 출력하는 구성 요소를 지정합니다.

추가 구성 요소는 무시됩니다.

 

다른 픽셀 셰이더 출력(o2, o3 등)에 쓰는 것은 정의되지 않았습니다.

슬롯 0에 바인딩되지 않은 경우 렌더링 대상에 쓸 수 없습니다.

oDepth 쓰기는 이중 소스 색 혼합 동안 유효합니다.

예를 들어 픽셀 셰이더 출력 혼합을 참조하세요.

여러 RenderTargets 개요

픽셀 셰이더를 사용하여 8개 이상의 개별적 렌더링 대상을 렌더링할 수 있으며, 렌더링 대상은 모두 동일한 유형(버퍼, Texture1D, Texture1DArray 등)이어야 합니다.

또한 모든 렌더링 대상은 모든 치수(너비, 높이, 깊이, 배열 크기, 샘플 수)의 크기가 동일해야 합니다.

렌더링 대상마다 데이터 형식이 다를 수 있습니다.

렌더링 대상 슬롯의 어떤 조합도 사용할 수 있습니다(최대 8).

하지만 리소스 보기는 다중 렌더링 대상 슬롯에 동시에 바인딩할 수 없습니다.

리소스를 동시에 사용하지 않는 한 보기는 다시 사용할 수 있습니다.

Output-Write 마스크 개요

출력 쓰기 마스크를 사용하여 렌더링 대상에 쓸 수 있는 데이터를 (구성 요소별로) 제어합니다.

샘플 마스크 개요

샘플 마스크는 활성화된 렌더링 대상에서 업데이트되는 샘플을 결정하는 32비트 다중 샘플 커버리지 마스크입니다. 하나의 샘플 마스크만 허용됩니다. 샘플 마스크 내 비트의 리소스 내 샘플에 대한 매핑은 사용자가 정의합니다. n 샘플 렌더링의 경우 샘플 마스크의 첫 번째 n비트(LSB의 비트)가 사용됩니다(최대 비트 수인 경우 32비트).

섹션 내용

Depth-Stencil 기능 구성 이 섹션에서는 출력 병합기 단계의 깊이 스텐실 버퍼와 깊이 스텐실 상태를 설정하는 단계를 다룹니다.
혼합 기능 구성 혼합 작업은 출력 값이 렌더링 대상에 기록되기 전에 모든 픽셀 셰이더 출력(RGBA 값)에서 수행됩니다. 다중 샘플링을 사용하도록 설정하면 각 다중 샘플에서 혼합이 수행됩니다. 그렇지 않으면 각 픽셀에서 혼합이 수행됩니다.
깊이 바이어스 3D 공간에서 평면인 다각형은 각 평면에 z-바이어스(또는 깊이 바이어스)를 추가하여 행성이 아닌 것처럼 표시할 수 있습니다.