스텐실 버퍼 기술(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에서 작업을 수행합니다. 테스트는 다음 단계를 사용하여 수행됩니다.
- 스텐실 마스크를 사용하여 스텐실 참조 값의 비트 AND 연산을 수행합니다.
- 스텐실 마스크를 사용하여 현재 픽셀에 대해 스텐실 버퍼 값의 비트 AND 연산을 수행합니다.
- 비교 함수를 사용하여 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))
관련 항목