다음을 통해 공유


Output-Merger 스테이지

OM(출력 병합기) 단계는 파이프라인 상태, 픽셀 셰이더에서 생성된 픽셀 데이터, 렌더링 대상의 내용 및 깊이/스텐실 버퍼의 내용을 조합하여 최종 렌더링된 픽셀 색을 생성합니다. OM 단계는 표시되는 픽셀(깊이 스텐실 테스트 포함)을 결정하고 최종 픽셀 색을 혼합하기 위한 마지막 단계입니다.

Direct3D 9와 Direct3D 10의 차이점:

  • Direct3D 9는 알파 테스트(알파 테스트 상태사용)를 구현하여 픽셀이 출력 렌더링 대상에 기록되는지 여부를 제어합니다.
  • Direct3D 10 이상에서는 알파 테스트(또는 알파 테스트 상태)를 구현하지 않습니다. 픽셀 셰이더 또는 깊이/스텐실 기능을 사용하여 제어할 수 있습니다.

Depth-Stencil 테스트 개요

텍스처 리소스로 만든 깊이 스텐실 버퍼는 깊이 데이터와 스텐실 데이터를 모두 포함할 수 있습니다. 깊이 데이터는 카메라에 가장 가까운 픽셀을 결정하는 데 사용되며, 스텐실 데이터는 업데이트할 수 있는 픽셀을 마스킹하는 데 사용됩니다. 궁극적으로 깊이 및 스텐실 값 데이터는 출력-병합 단계에서 픽셀을 그려야 하는지 여부를 결정하는 데 사용됩니다. 다음 다이어그램은 깊이 스텐실 테스트가 수행되는 방식을 개념적으로 보여줍니다.

깊이 스텐실 테스트가 작동하는 방식의 다이어그램

깊이 스텐실 테스트를 구성하려면 Depth-Stencil 기능 구성 참조하세요. 깊이 스텐실 개체는 깊이 스텐실 상태를 캡슐화합니다. 애플리케이션은 깊이 스텐실 상태를 지정할 수 있거나 OM 단계에서 기본값을 사용합니다. 혼합 작업은 다중 샘플링을 사용하지 않도록 설정된 경우 픽셀 단위로 수행됩니다. 다중 샘플링을 사용하는 경우 혼합은 다중 샘플링별로 발생합니다.

깊이 버퍼를 사용하여 그려야 하는 픽셀을 결정하는 프로세스를 깊이 버퍼링이라고도 하며 z 버퍼링이라고도 합니다.

깊이 값이 보간 또는 픽셀 셰이더에서 오는 출력 병합 단계에 도달하면 항상 고정됩니다. 부동 소수점 규칙을 사용하여 깊이 버퍼의 형식/정밀도에 따라 z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z))입니다. 클램핑 후 깊이 값을 기존 깊이 버퍼 값과 비교합니다(DepthFunc 사용). 깊이 버퍼가 바인딩되지 않은 경우 깊이 테스트는 항상 통과합니다.

깊이 버퍼 형식에 스텐실 구성 요소가 없거나 깊이 버퍼가 바인딩되지 않은 경우 스텐실 테스트는 항상 통과합니다. 그렇지 않으면 기능이 Direct3D 9에서 변경되지 않습니다.

한 번에 하나의 깊이/스텐실 버퍼만 활성화할 수 있습니다. 바인딩된 리소스 뷰는 깊이/스텐실 뷰와 일치해야 합니다(크기 및 차원). 이는 리소스 크기가 일치해야 한다는 의미는 아니며 보기 크기가 일치해야 한다는 의미입니다.

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

혼합 개요

혼합은 하나 이상의 픽셀 값을 결합하여 최종 픽셀 색을 만듭니다. 다음 다이어그램에서는 픽셀 데이터 혼합과 관련된 프로세스를 보여 줍니다.

데이터 혼합이다이어그램

개념적으로 출력 병합 단계에서 두 번 구현된 이 흐름 차트를 시각화할 수 있습니다. 첫 번째 흐름 차트는 RGB 데이터를 혼합하고 두 번째 흐름 차트는 알파 데이터를 혼합합니다. API를 사용하여 혼합 상태를 만들고 설정하는 방법을 보려면 혼합 기능 구성하는참조하세요.

고정 함수 혼합은 각 렌더링 대상에 대해 독립적으로 사용할 수 있습니다. 그러나 혼합 컨트롤 집합은 하나뿐이므로 혼합을 사용하도록 설정된 모든 RenderTargets에 동일한 혼합이 적용됩니다. 혼합 값(BlendFactor 포함)은 혼합하기 전에 항상 렌더링 대상 형식의 범위로 고정됩니다. 클램핑은 렌더링 대상 유형에 따라 렌더링 대상별로 수행됩니다. 유일한 예외는 고정되지 않은 float16, float11 또는 float10 형식에 대한 것이므로 이러한 형식에 대한 혼합 작업은 출력 형식과 적어도 동일한 정밀도/범위로 수행할 수 있습니다. NaN 및 부호 있는 0은 모든 경우(0.0 혼합 가중치 포함)에 전파됩니다.

sRGB 렌더링 대상을 사용하는 경우 런타임은 렌더링 대상 색을 선형 공간으로 변환한 후 혼합을 수행합니다. 런타임은 렌더링 대상에 값을 다시 저장하기 전에 최종 혼합 값을 다시 sRGB 공간으로 변환합니다.

Direct3D 9와 Direct3D 10의 차이점:

  • Direct3D 9에서는 각 렌더링 대상에 대해 고정 함수 혼합을 독립적으로 사용하도록 설정할 수 있습니다.
  • Direct3D 10 이상에는 하나의 혼합 상태 설명이 있습니다. 따라서 모든 렌더링 대상에 대해 하나의 혼합 값을 설정할 수 있습니다.

Dual-Source 색 혼합

이 기능을 사용하면 출력 병합기 단계에서 슬롯 0의 단일 렌더링 대상과 혼합 작업에 대한 입력으로 두 픽셀 셰이더 출력(o0 및 o1)을 동시에 사용할 수 있습니다. 유효한 혼합 작업에는 add, subtract 및 revsubtract가 포함됩니다. SrcBlend, DestBlend, SrcBlendAlpha 또는 DestBlendAlpha에 대한 유효한 혼합 옵션에는 D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_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-바이어스(또는 깊이 바이어스)를 추가하여 평상수가 아닌 것처럼 표시할 수 있습니다.

그래픽 파이프라인

파이프라인 단계(Direct3D 10)