Share via


스텐실 버퍼 기술(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))

픽셀 파이프라인