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