다음을 통해 공유


스텐실 버퍼 기술(Direct3D 9)

애플리케이션은 스텐실 버퍼를 사용하여 이미지의 픽셀을 마스킹합니다. 마스크는 픽셀이 그려지는지 여부를 제어합니다. 더 일반적인 효과 중 일부는 아래에 나와 있습니다.

스텐실 버퍼는 렌더링 대상 화면에 픽셀 단위로 그리기를 사용하거나 사용하지 않도록 설정합니다. 가장 기본적인 수준에서 애플리케이션은 렌더링된 이미지의 섹션을 마스킹하여 표시되지 않도록 할 수 있습니다. 애플리케이션은 용해, 데칼링 및 개요와 같은 특수 효과에 스텐실 버퍼를 사용하는 경우가 많습니다.

스텐실 버퍼 정보는 z-버퍼 데이터에 포함됩니다. 애플리케이션은 다음 코드 예제와 같이 IDirect3D9::CheckDeviceFormat 메서드를 사용하여 하드웨어 스텐실 지원을 확인할 수 있습니다.

// Reject devices that cannot perform 8-bit stencil buffering. 
// The following example assumes that pCaps is a valid pointer 
// to an initialized D3DCAPS9 structure. 

if( FAILED( m_pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal,
                                       pCaps->DeviceType,  
                                       Format,  
                                       D3DUSAGE_DEPTHSTENCIL, 
                                       D3DRTYPE_SURFACE,
                                       D3DFMT_D24S8 ) ) )
return E_FAIL;

IDirect3D9::CheckDeviceFormat 사용하면 해당 디바이스의 기능에 따라 만들 디바이스를 선택할 수 있습니다. 이 경우 8비트 스텐실 버퍼를 지원하지 않는 디바이스는 거부됩니다. 이는 IDirect3D9::CheckDeviceFormat; 에 사용할 수 있는 유일한 용도입니다. 자세한 내용은 하드웨어 지원 확인(Direct3D 9) 참조하세요.

스텐실 버퍼의 작동 방식

Direct3D는 픽셀 단위로 스텐실 버퍼의 내용에 대한 테스트를 수행합니다. 대상 표면의 각 픽셀에 대해 스텐실 버퍼의 해당 값, 스텐실 참조 값 및 스텐실 마스크 값을 사용하여 테스트를 수행합니다. 테스트가 통과하면 Direct3D에서 작업을 수행합니다. 테스트는 다음 단계를 사용하여 수행됩니다.

  1. 스텐실 마스크를 사용하여 스텐실 참조 값의 비트 AND 연산을 수행합니다.
  2. 스텐실 마스크를 사용하여 현재 픽셀에 대해 스텐실 버퍼 값의 비트 AND 연산을 수행합니다.
  3. 비교 함수를 사용하여 1단계의 결과를 2단계의 결과와 비교합니다.

이러한 단계는 다음 코드 예제에 나와 있습니다.

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
StencilBufferValue

는 현재 픽셀에 대한 스텐실 버퍼의 내용입니다. 이 코드 예제에서는 앰퍼샌드(&) 기호를 사용하여 비트 AND 연산을 나타냅니다.

StencilMask

는 스텐실 마스크의 값을 나타내며,

StencilRef

는 스텐실 참조 값을 나타냅니다.

CompFunc

는 비교 함수입니다.

스텐실 테스트가 통과하면 현재 픽셀이 대상 화면에 기록되고, 그렇지 않으면 무시됩니다. 기본 비교 동작은 각 비트 연산이 어떻게 표시되든(D3DCMP_ALWAYS) 픽셀을 작성하는 것입니다. D3DRS_STENCILFUNC 렌더링 상태의 값을 변경하고 D3DCMPFUNC 열거형 형식의 멤버를 전달하여 원하는 비교 함수를 식별하여 이 동작을 변경할 수 있습니다.

애플리케이션은 스텐실 버퍼의 작업을 사용자 지정할 수 있습니다. 비교 함수, 스텐실 마스크 및 스텐실 참조 값을 설정할 수 있습니다. 스텐실 테스트가 통과하거나 실패할 때 Direct3D에서 수행하는 작업을 제어할 수도 있습니다. 자세한 내용은 스텐실 버퍼 상태(Direct3D 9)참조하세요.

예제

다음 코드 예제에서는 스텐실 버퍼를 설정하는 방법을 보여 줍니다.

// Enable stencil testing
pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);

// Specify the stencil comparison function
pDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);

// Set the comparison reference value
pDevice->SetRenderState(D3DRS_STENCILREF, 0);

//  Specify a stencil mask 
pDevice->SetRenderState(D3DRS_STENCILMASK, 0);

기본적으로 스텐실 참조 값은 0입니다. 정수 값은 유효합니다. Direct3D는 스텐실 테스트 전에 스텐실 참조 값 및 스텐실 마스크 값의 비트 AND를 수행합니다.

스텐실 비교에 따라 기록되는 픽셀 정보를 제어할 수 있습니다.

// A write mask controls what is written
pDevice->SetRenderState(D3DRS_STENCILWRITEMASK, D3DSTENCILOP_KEEP);
// Specify when to write stencil data
pDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);

다음 예제와 같이 스텐실 버퍼에 쓸 값에 대한 고유한 수식을 작성할 수 있습니다.

NewStencilBufferValue = (StencilBufferValue & ~StencilWriteMask) | 
                        (StencilWriteMask & StencilOp(StencilBufferValue))

Pixel 파이프라인