0420

2025년 4월 20일

카테고리 : 게임엔진, 그래픽스

스텐실 버퍼를 써서 2D 클리핑 기능을 구현함.

0420.gif

매 프레임마다:

// 주의!!
//      -> 여기서 말하는 '마스킹, 마스크' 는
//          사실 본의미는 '가리는 거' 지만,
//          걍 영역이라고 생각하셈

enable(StencilTest)
clear_stencil(0);
clear_buffer(Stencil)

// N번째 마스킹
//  -> 아무 조건 없이, 해당 픽셀의 스텐실값을 1 증가시킨다.
stencil_func(Always, 1, 0xFF)
stencil_op(Keep, Keep, IncreaseWrapped);

// 이때 마스크 렌더링을 진행한다!!!    
//    일단 마스크 2개를 그려보자.
draw_something();
draw_something();

// 스크린 쿼드 그려서 N번째 마스킹 도중에 정리하기
// 만약 겹쳐진 부분이 있다면, 그 부분의 스텐실 값은 2였을 것임.
// 따라서 2보다 작은 부분은 걍 0으로 초기화.
stencil_func(Less, 2, 0xFF) // 2보다 작으면
stencil_op(Kepp, Kepp, Zero) // 0으로 만든다.
draw_screen_quad();

// 마스크 적용해서 오브젝트 그려보기
stencil_func(Equal, 2, 0xFF) // 스텐실이 2와 같은 경우에만 (=마스크 영역에만)    
stencil_op(Keep, Keep, Keep) // 스텐실값은 건들지 말고
draw_something();

disable(StencilTest)