혼합 기능 구성
혼합 작업은 출력 값이 렌더링 대상에 기록되기 전에 모든 픽셀 셰이더 출력(RGBA 값)에서 수행됩니다. 다중 샘플링을 사용하도록 설정하면 각 다중 샘플에서 혼합이 수행됩니다. 그렇지 않으면 각 픽셀에서 혼합이 수행됩니다.
혼합 상태 만들기
혼합 상태는 혼합을 제어하는 데 사용되는 상태의 컬렉션입니다. 이러한 상태( D3D11_BLEND_DESC1 정의됨)는 ID3D11Device1::CreateBlendState1을 호출하여 혼합 상태 개체를 만드는 데 사용됩니다.
instance 알파 혼합을 사용하지 않도록 설정하고 구성 요소당 픽셀 마스킹을 사용하지 않는 혼합 상태 만들기의 매우 간단한 예는 다음과 같습니다.
ID3D11BlendState1* g_pBlendStateNoBlend = NULL;
D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);
이 예제는 HLSLWithoutFX10 샘플과 유사합니다.
혼합 상태 바인딩
blend-state 개체를 만든 후 ID3D11DeviceContext::OMSetBlendState를 호출하여 blend-state 개체를 출력 병합 단계에 바인딩합니다.
float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask = 0xffffffff;
pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);
이 API는 혼합 상태 개체, 4개 구성 요소 혼합 요소 및 샘플 마스크의 세 가지 매개 변수를 사용합니다. blend-state 개체에 대해 NULL 을 전달하여 기본 혼합 상태를 지정하거나 blend-state 개체에 전달할 수 있습니다. D3D11_BLEND_BLEND_FACTOR 또는 D3D11_BLEND_INV_BLEND_FACTOR 혼합 상태 개체를 만든 경우 혼합 요소를 전달하여 픽셀 셰이더, 렌더링 대상 또는 둘 다에 대한 값을 변조할 수 있습니다. D3D11_BLEND_BLEND_FACTOR 또는 D3D11_BLEND_INV_BLEND_FACTOR 혼합 상태 개체를 만들지 않은 경우에도 NULL이 아닌 혼합 계기를 전달할 수 있지만 혼합 단계에서는 혼합 요소를 사용하지 않습니다. 런타임은 혼합 요소를 저장하고 나중에 ID3D11DeviceContext::OMGetBlendState를 호출하여 혼합 요소를 검색할 수 있습니다. NULL을 전달하는 경우 런타임은 { 1, 1, 1, 1 }과 같은 혼합 요소를 사용하거나 저장합니다. 샘플 마스크는 업데이트하기 전에 기존 렌더링 대상을 샘플링하는 방법을 결정하는 사용자 정의 마스크입니다. 기본 샘플링 마스크는 점 샘플링을 지정하는 0xffffffff.
가장 깊이 있는 버퍼링 구성표에서 카메라에 가장 가까운 픽셀은 그려지는 픽셀입니다. 깊이 스텐실 상태를 설정할 때 D3D11_DEPTH_STENCIL_DESCDepthFunc 멤버는 D3D11_COMPARISON_FUNC 수 있습니다. 일반적으로 카메라에 가장 가까운 픽셀이 뒤에 있는 픽셀을 덮어쓰도록 DepthFunc 를 D3D11_COMPARISON_LESS 합니다. 그러나 애플리케이션의 요구 사항에 따라 다른 비교 함수를 사용하여 깊이 테스트를 수행할 수 있습니다.
고급 혼합 항목
알파-적용 범위
알파-적용 범위는 알파 투명도를 사용하여 표면 내의 가장자리를 정의하는 여러 개의 겹치는 다각형이 있는 조밀한 단풍과 같은 상황에 가장 유용한 다중 샘플링 기술입니다.
D3D11_BLEND_DESC1 또는 D3D11_BLEND_DESCAlphaToCoverageEnable 멤버를 사용하여 런타임이 출력 레지스터 SV_Target0의 .a 구성 요소(알파)를 픽셀 셰이더에서 n단계 검사 마스크(n-샘플 RenderTarget 제공)로 변환할지 여부를 전환할 수 있습니다. 런타임은 모든 활성 RenderTargets에서 업데이트할 샘플을 결정하기 위해 기본형(샘플 마스크 외에도)의 픽셀에 대한 일반적인 샘플 검사와 함께 이 마스크의 AND 작업을 수행합니다.
픽셀 셰이더가 SV_Coverage 출력하는 경우 런타임은 알파-검사 기능을 사용하지 않도록 설정합니다.
참고
다중 샘플링에서 런타임은 모든 RenderTarget에 대해 하나의 검사만 공유합니다. AlphaToCoverageEnable이 TRUE일 때 런타임이 출력 SV_Target0에서 검사로 .a를 읽고 변환한다는 사실은 RenderTarget 0의 블렌더로 가는 .a 값을 변경하지 않습니다(RenderTarget이 설정된 경우). 일반적으로 알파-적용 범위를 사용하도록 설정하는 경우 런타임이 알파-검사 마스크를 사용하여 검사 마스크의 AND 연산을 수행한다는 점을 제외하고는 픽셀 셰이더의 모든 색 출력이RenderTarget과 상호 작용하는 방식에 영향을 주지 않습니다. 알파-검사 기능은 런타임이 RenderTarget 을 혼합할 수 있는지 또는 RenderTarget에서 혼합을 사용할지 여부에 독립적으로 작동합니다.
그래픽 하드웨어는 픽셀 셰이더 SV_Target0.a(알파)를 검사 마스크로 변환하는 방법을 정확하게 지정하지 않습니다. 단, 0 이하의 알파는 적용 범위 없이 매핑되어야 하며 알파 1 이상은 전체 검사에 매핑되어야 합니다(런타임이 실제 기본 검사로 AND 작업을 수행하기 전에). 알파가 0에서 1로 진행되면 결과 적용 범위는 일반적으로 단조롭게 증가해야 합니다. 그러나 하드웨어는 공간 해상도 및 노이즈를 희생하여 알파 값의 몇 가지 더 나은 양자화를 제공하기 위해 영역 디더링을 수행할 수 있습니다. NaN의 알파 값(숫자가 아님)은 검사 없음(0) 마스크를 생성합니다.
알파-적용 범위는 일반적으로 화면 도어 투명도 또는 불투명 스프라이트에 대한 자세한 실루엣을 정의하는 데 사용됩니다.
픽셀 셰이더 출력 혼합
이 기능을 사용하면 출력 병합기에서 두 픽셀 셰이더 출력을 동시에 입력 소스로 사용하여 슬롯 0의 단일 렌더링 대상과 혼합 작업을 수행할 수 있습니다.
이 예제에서는 두 개의 결과를 가져와서 단일 패스로 결합하여 대상에 곱하고 다른 결과를 추가와 혼합합니다.
SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;
다음은 첫 번째 픽셀 셰이더 출력을 원본 색으로 구성하고 두 번째 출력을 색별 구성 요소 혼합 요소로 구성하는 예제입니다.
SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;
이 예제에서는 혼합 요소가 셰이더 스위즐과 일치해야 하는 방법을 보여 줍니다.
SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
// RenderTarget slot 0 to .ra
혼합 요소와 셰이더 코드는 함께 o0.r 및 o1.a 이상을 출력하려면 픽셀 셰이더가 필요하다는 것을 의미합니다. 추가 출력 구성 요소는 셰이더에서 출력할 수 있지만 무시됩니다. 구성 요소가 적으면 정의되지 않은 결과가 생성됩니다.
관련 항목