스텐실 버퍼(Stencil Buffer)는 컴퓨터 그래픽스에서 특정 픽셀에 대해 렌더링을 제한하거나 제어하는 데 사용되는 버퍼이다. 깊이 버퍼와 비슷하게 픽셀 단위로 작동하며, 각 픽셀에 대해 스텐실 값(stencil value)을 저장하고 이를 기반으로 해당 픽셀에 그리기 작업을 수행할지 여부를 결정한다.
스텐실 버퍼는 렌더링할 때 각 픽셀에 대해 스텐실 테스트(stencil test)를 수행한다. 스텐실 테스트는 현재 렌더링할 픽셀의 스텐실 값이 미리 정의된 조건과 일치하는지 확인한 후, 그에 따라 픽셀을 그릴지 말지를 결정한다.
• 스텐실 값 초기화: 보통 화면의 스텐실 값은 0으로 초기화.
• 스텐실 테스트: 각 픽셀을 그리기 전에, 스텐실 버퍼에 저장된 값과 조건을 비교하여 테스트를 수행. 이때, 스텐실 테스트가 성공하면 해당 픽셀에 대해 렌더링이 진행되고, 실패하면 해당 픽셀은 렌더링되지 않는다.
• 스텐실 값 업데이트: 스텐실 테스트 후, 지정된 규칙에 따라 스텐실 값이 변경될 수 있다. 예를 들어, 특정 조건에서 값이 증가하거나 감소하게 할 수 있습니다.
glEnable(GL_STENCIL_TEST);
glStencilFunc(GLenum func, GLint ref, GLuint mask);
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
glStencilMask(GLuint mask);
glEnable(GL_STENCIL_TEST);
• 역할: 스텐실 테스트를 활성화합니다.
• 기능: 이 함수는 OpenGL에서 스텐실 테스트를 가능하게 하며, 이후에 정의된 스텐실 조건에 따라 픽셀을 렌더링할지 여부를 결정하게 됩니다.
glStencilFunc(GLenum func, GLint ref, GLuint mask);
역할: 스텐실 테스트의 기준을 설정합니다.
인자 설명:
func: 스텐실 테스트에 사용할 조건을 설정합니다. 픽셀의 스텐실 값과 기준 값(ref)을 비교하는 조건입니다. 주요 옵션으로는 다음이 있습니다:
ref: 스텐실 테스트의 기준 값입니다. 스텐실 버퍼에 저장된 값과 이 ref 값을 비교하여 테스트합니다.
mask: 스텐실 값과 기준 값을 비교할 때 사용할 마스크입니다. 이 값은 특정 비트만 비교하기 위해 사용됩니다. 예를 들어, mask가 0xFF이면 모든 비트를 비교하게 되고, 특정 비트만 사용하고 싶을 때는 그에 맞는 마스크 값을 설정합니다.
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);역할: 스텐실 테스트 및 깊이 테스트의 결과에 따라 스텐실 값을 어떻게 업데이트할지를 결정한다.
인자 설명:
sfail: 스텐실 테스트가 실패했을 때 적용할 동작을 설정.dpfail: 스텐실 테스트는 통과했으나, 깊이 테스트가 실패했을 때 적용할 동작을 설정.dppass: 스텐실 테스트와 깊이 테스트가 모두 통과했을 때 적용할 동작을 설정.각각의 인자는 다음과 같은 값을 가질 수 있습니다:
glStencilMask(GLuint mask);스텐실 버퍼는 다양한 그래픽 효과를 구현할 때 매우 유용하게 활용. 이를 이용해 특정 영역에서만 렌더링을 제한하거나 조건부 렌더링을 수행할 수 있기 때문에, 여러 그래픽 작업에서 필수적인 도구이다.
스텐실 버퍼는 그림자 생성에 자주 사용됩니다. 주로 쉐도우 볼륨(Shadow Volume) 방식을 사용하여, 빛이 가려진 영역을 스텐실 버퍼에 기록한 후 이 영역에 그림자를 적용합니다. 스텐실 값을 이용해 그림자를 적용할 영역을 식별하고, 그림자 효과를 적용합니다.
1. 빛에 의해 가려지는 오브젝트를 기준으로 그림자 영역을 생성합니다.
2. 그림자 영역에 해당하는 위치에 스텐실 값을 업데이트합니다.
3. 스텐실 값을 바탕으로 그린 그림자 영역에 적절한 렌더링을 수행합니다.
반사 효과는 스텐실 버퍼를 사용하여 거울 표면과 같은 특정 영역에만 오브젝트를 반사시킬 수 있습니다.
1. 먼저 거울과 같은 반사면을 렌더링할 영역을 스텐실 버퍼에 기록합니다.
2. 스텐실 버퍼에 기록된 영역에만 오브젝트를 거꾸로 렌더링하여 반사 효과를 만들어냅니다.
3. 이후 반사되지 않는 다른 부분을 렌더링하여, 반사되는 오브젝트와 나머지 환경이 자연스럽게 결합되도록 합니다.
스텐실 버퍼를 사용하여 화면의 특정 영역에서만 렌더링을 허용하거나 제한할 수 있습니다. 예를 들어, 창문이나 구멍과 같은 특정 모양 안에서만 오브젝트를 렌더링할 때 사용할 수 있습니다.
1. 렌더링할 영역을 스텐실 버퍼에 기록합니다.
2. 이후 렌더링할 때 스텐실 버퍼에서 해당 영역에만 렌더링이 이루어지도록 제한합니다.
여러 렌더링 패스를 통해 복잡한 효과를 구현할 때, 스텐실 버퍼를 사용하여 이전 패스에서 기록한 정보를 기반으로 후속 패스를 조정할 수 있습니다. 예를 들어, 첫 번째 패스에서 특정 오브젝트의 형태를 스텐실 버퍼에 기록한 후, 두 번째 패스에서 그 정보에 기반하여 렌더링을 다르게 수행할 수 있습니다.
오브젝트의 윤곽선을 강조하기 위해 스텐실 버퍼가 사용됩니다. 이 방법은 두 번의 렌더링 패스를 통해 윤곽선을 그립니다.
1. 첫 번째 패스에서는 오브젝트를 스텐실 버퍼에 기록하고 깊이 버퍼에 값을 저장합니다.
2. 두 번째 패스에서는 오브젝트를 약간 확대하여 윤곽선을 그리되, 스텐실 값과 깊이 값이 이전 패스와 다른 부분에서만 렌더링합니다.