출력 병합기 단계
OM(출력 병합기) 단계는 파이프라인 상태, 픽셀 셰이더에서 생성된 픽셀 데이터, 렌더링 대상의 내용 및 깊이/스텐실 버퍼의 내용을 조합하여 최종 렌더링된 픽셀 색을 생성합니다. OM 단계는 표시되는 픽셀(깊이 스텐실 테스트 포함)을 결정하고 최종 픽셀 색을 혼합하기 위한 마지막 단계입니다.
Direct3D 9와 Direct3D 10의 차이점:
- Direct3D 9는 알파 테스트( 알파 테스트 상태 사용)를 구현하여 픽셀이 출력 렌더링 대상에 기록되는지 여부를 제어합니다.
- Direct3D 10 이상에서는 알파 테스트(또는 알파 테스트 상태)를 구현하지 않습니다. 픽셀 셰이더 또는 깊이/스텐실 기능을 사용하여 제어할 수 있습니다.
Depth-Stencil 테스트 개요
질감 리소스로 생성되는 깊이 스텐실 버퍼는 깊이 데이터와 스텐실 데이터를 모두 포함할 수 있습니다. 깊이 데이터는 카메라에 가장 가까운 픽셀을 결정하는 데 사용되고, 스텐실 데이터는 업데이트할 수 있는 픽셀을 마스크하는 데 사용됩니다. 결국 출력 병합기 단계는 깊이 값과 스텐실 값을 모두 사용하여 픽셀을 그려야 하는지 여부를 결정합니다. 다음 다이어그램에서는 깊이 스텐실 테스트를 수행하는 방법을 개념적으로 보여 줍니다.
깊이 스텐실 테스트를 구성하려면 깊이 스텐실 기능 구성을 참조하세요. 깊이 스텐실 개체는 깊이 스텐실 상태를 캡슐화합니다. 애플리케이션이 깊이 스텐실 상태를 지정할 수 있으며 그렇지 않을 경우, OM 단계는 기본값을 사용합니다. 다중 샘플링이 사용하지 않도록 설정된 경우 픽셀별 혼합 연산이 수행됩니다. 다중 샘플링이 사용하도록 설정된 경우 다중 샘플별 혼합이 이루어집니다.
깊이 버퍼를 사용하여 어떤 픽셀을 그릴지 결정하는 프로세스를 깊이 버퍼링이라고 하며, 경우에 따라 z 버퍼링이라고도 합니다.
깊이 값이 출력 병합기 단계에 도달하면(깊이 값이 보간에서 발생하건 픽셀 셰이더에서 발생하건 상관없이) 깊이 값은 깊이 버퍼의 형식/정확도에 따라 부동 소수점 규칙을 사용하여 항상 고정됩니다. z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) 고정 후 기본 깊이 버퍼 값을 기준으로 깊이 값을 비교합니다(DepthFunc 사용). 바인딩된 깊이 버퍼가 없으면 깊이 테스트는 항상 통과됩니다.
깊이 버퍼 형식에 스텐실 구성 요소가 없거나 바인딩된 깊이 버퍼가 없는 경우에는 스텐실 테스트가 항상 통과됩니다. 그렇지 않으면 기능이 Direct3D 9에서 변경되지 않습니다.
한 번에 하나의 깊이/스텐실 버퍼만 활성화될 수 있습니다. 바인딩된 리소스 보기는 깊이/스텐실 보기와 일치해야 합니다(같은 크기와 치수). 이것은 리소스 크기가 아니라 보기 크기가 일치해야 함을 뜻합니다.
깊이 스텐실 테스트에 대한 자세한 내용은 자습서 14를 참조하세요.
혼합 개요
혼합은 하나 이상의 픽셀 값을 조합하여 최종 픽셀 색을 만듭니다. 다음 다이어그램에서는 픽셀 데이터 혼합에 관련된 프로세스를 보여 줍니다.
개념적으로 출력 병합기 단계에서 두 번 구현된 이 흐름 차트를 시각화할 수 있습니다. 첫 번째 흐름 차트는 RGB 데이터를 혼합하고 두 번째 흐름 차트는 알파 데이터를 혼합합니다. API를 사용하여 혼합 상태를 만들고 설정하는 방법은 혼합 기능 구성을 참조하세요.
고정 기능 혼합은 각 렌더링 대상에 대해 독립적으로 사용하도록 설정할 수 있습니다. 그러나 혼합 컨트롤 세트가 하나뿐이므로 혼합이 사용하도록 설정된 모든 RenderTarget에 동일한 혼합이 적용됩니다. 혼합 값(BlendFactor 포함)은 항상 혼합 전에 렌더링-대상 형식 범위에 고정됩니다. 고정은 렌더링 대상별로 이루어지며 렌더링 대상 유형을 사용합니다. 유일한 예외는 고정되지 않는 float16, float11 또는 float10 형식으로서 이 형식의 혼합 연산은 출력 형식과 적어도 동일한 정확도/범위로 수행될 수 있습니다. 모든 경우(0.0 혼합 가중치 포함)에 NaN과 서명된 0이 전파됩니다.
sRGB 렌더링 대상을 사용하면 런타임은 혼합을 수행하기 전에 렌더링 대상 색을 선형 공간으로 변환합니다. 런타임은 혼합된 최종 값을 다시 sRGB 공간으로 변환한 후 렌더링 대상에 값을 다시 저장합니다.
Direct3D 9와 Direct3D 10의 차이점:
- Direct3D 9에서는 각 렌더링 대상에 대해 고정 함수 혼합을 독립적으로 사용하도록 설정할 수 있습니다.
- Direct3D 10 이상에는 하나의 혼합 상태 설명이 있습니다. 따라서 모든 렌더링 대상에 대해 하나의 혼합 값을 설정할 수 있습니다.
Dual-Source 색 혼합
이 기능을 사용하면 출력 병합기 단계에서 두 픽셀 셰이더 출력(o0 및 o1)을 슬롯 0의 단일 렌더링 대상과 혼합 작업에 대한 입력으로 동시에 사용할 수 있습니다. 유효한 혼합 연산에는 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-바이어스(또는 깊이 바이어스)를 추가하여 행성이 아닌 것처럼 표시할 수 있습니다. |