C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 22. Direct3D Stencil

GameChoi 2023. 6. 19. 16:25

1. Direct3D Stencil

1.1 Stencil

1.1.1 Stencil Buffer

 - 스텐실 버퍼는 어떤 특수 효과를 내는데 사용할 수 있는 화면 밖 버퍼

   - 스텐실 버퍼는 후면 버퍼, 깊이 버퍼와 해상도가 같으며, 스텐실 버퍼의 픽셀은 후면 버퍼 & 깊이 버퍼 픽셀과 대응

     - 스텐실 버퍼를 지정한 경우 스텐실 버퍼는 깊이 버퍼에 부착

   - 포스터나 판화에 쓰이는 스텐실의 용도와 같음, 특정 픽셀 단편들이 후면 버퍼에 기록되지 못하게 만드는 데 쓰임

     - 거울을 구현할 때 물체가 반사된 이미지를 거울의 평면에 그려야 함

       - 거울 테두리 바깥까지 반사상이 그려져서는 안됨

1.1.2 Depth & Stencil Buffer

 - Depth & Stencil Buffer를 생성할 때 특정한 자료 형식을 지정할 필요가 있음

DXGI_FORMAT_D32_FL0AT_S8X24_UINT; DXGI_FORMAT_D24_UNORM_S8_UINT;

   - 매 프레임의 시작에서 깨끗이 지워야 함

void ID3DllDeviceContext::ClearDepthStencilView;

1.1.3 Stencil Test

 - 스텐실 버퍼를 이용하면 후면 버퍼의 특정 영역으로의 렌더링을 방지

   - 주어진 한 픽셀을 후면 버퍼에 기록할 것인지 아닌지를 스텐실 버퍼에 근거해서 판정하는 것

     - 스텐실 적용이 활성화된 경우 스텐실 판정은 픽셀이 래스터화되는 과정에서 일어남(OM)

   - 두 피연산자를 응용 프로그램이 지정한 비교 연산자로 비교하는 것

     - 응용 프로그램이 정의한 스텐실 기준 값 & 응용 프로그램이 정의한 마스킹 값을 비트별 논리곱으로 결합

     - 스텐실 버퍼에 이미 있던 해당 픽셀의 값 & 응용 프로그램이 정의한 마스킹 값을 비트별 논리곱으로 결합

if(StencilRef & StencilReadMask (비교 연산자) Value & StencilReadMask);

   - 비교 연산자를 사용할 수 있는 함수의 종류가 구조체로 지정

typedef enum D3D11_COMPARISON_FUNC;

1.1.4 Stencil Interface

 - 스텐실 인터페이스를 생성하기 전 밑의 구조체를 채워 사용

typedef struct D3D11_DEPTH_STENCIL_DESC;

   - 위의 구조체를 채워 다음 함수를 호출하여 인터페이스를 가리키는 포인터를 얻음

HRESULT ID3D11Device::CreateDepthStencilState;

     - 인터페이스의 포인터를 얻고 이후 Depth & Stencil 상태를 출력 병합기(OM) 단계에 묶음

void ID3D11DeviceContext::OMSetDepthStencilState;