Stencil buffer 사용하기
스텐실 버퍼
stencil buffer는 특수한 효과를 위한 off-screen buffer로, back buffer 및 depth buffer와 동일한 해상도를 가진다. 따라서, stencil buffer 내의 (i, j)번째 픽셀은 back/depth buffer의 (i, j)번째 픽셀과 대응된다.
이름이 의미하는 것 처럼 stencil buffer는 back buffer의 일정 부분이 렌더링되는 것을 막는 효과를 위해 사용된다. 예를 들어, 거울에 특정 물체를 반사하도록 할려고 한다면, 거울에 반사되는 부분에 대해서만 드로잉을 수행하면 된다. 이 때 거울에 비치지 않는 부분은 렌더링되는 것을 막을 수 있는 있도록 하는 것이 바로 stencil buffer다.
다음과 같은 곳에 활용할 수 있다.
- 거울에 비치는 물체를 그릴때
- Shadow volume 을 이용한 그림자 렌더링
- 기타 다양한 마스킹( FPS 저격 줌인? )
기초 지식
렌더링 테스트의 순서 : 스텐실 테스트 -> Z-Test
In 게임브리오(StencilShadow.cpp)
NiStencilPropertyPtr spStencil = NiNew NiStencilProperty;
spStencil->SetStencilOn(true);
// 스텐실 테스트는 항상 통과하도록함
spStencil->SetStencilFunction(NiStencilProperty::TEST_ALWAYS);
// 스텐실 테스트에 실패해서 아무것도 그려지지 않게 생겼을 경우...
spStencil->SetStencilFailAction(NiStencilProperty::ACTION_KEEP);
// 스텐실 테스트와 Z-Test 모두 통과 했을 경우...
spStencil->SetStencilPassAction(NiStencilProperty::ACTION_INCREMENT);
// 스텐실 테스트는 통과했으나, Z-Test에서 통과하지 못했을 경우...
spStencil->SetStencilPassZFailAction(NiStencilProperty::ACTION_KEEP);
// 양면을 모두 그리도록..
spStencil->SetDrawMode(NiStencilProperty::DRAW_BOTH);
spShaft->AttachProperty(spStencil);
위에서 보면.. Stencil을 통과했다라는 말이.. Stencil + Z-Test 통과라는 것을 알 수 있다.
볼륨쉐도우
자세한 방법은 네이버씨에게 물어보거나, 아니면 책을 보면 쉽게 이해할 수 있다.
볼륨 쉐도우는
단순하고 정적인 Blocker가
복잡한 형태의 혹은 애니매이션 되는 대상에게 그림자를 드리울 때, 사용하면 가장 좋다!
왜? 볼륨쉐도우니까... 공부합시다!
[출처] Stencil buffer 사용하기|작성자 프라이드
'Gamebryo > Lecture' 카테고리의 다른 글
Mesh 만들기 (0) | 2011.11.08 |
---|---|
Mesh의 생성 ( Particle, 검궤적 등 ) (0) | 2011.11.08 |
게임브리오 2D Line관련 (0) | 2011.10.30 |
FrameRenderSystem에서.. 커스텀알파소터프로세스.. (0) | 2011.09.18 |
무기잔상효과 (0) | 2011.02.08 |