DirectX Graphics 프로그래밍 가이드 고도의 주제 픽셀 파이프라인 스텐실 버퍼 테크닉 양면 스텐실 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
스텐실 버퍼를 사용해 그림자를 드로잉(Drawing) 하려면 , 그림자 볼륨을 사용한다. 애플리케이션은, 실루엣의 엣지를 계산해, 그 엣지를 광원으로부터 밀어 내 3D 볼륨을 생성하는 것에 의해, 가림 지오메트리에 의해 할 수 있는 그림자 볼륨을 계산한다. 이러한 볼륨은 스텐실 버퍼에 2 회 렌더링 된다.
최초의 렌더링에서는 적극적인 다각형이 드로잉(Drawing) 되어 스텐실 버퍼값이 인크리먼트(increment) 된다. 2 번째의 렌더링에서는, 퇴행적인 다각형이 드로잉(Drawing) 되어 스텐실 버퍼값이 감소 된다. 보통, 인크리먼트(increment) 된 값과 감소 된 값은 모두 서로 지운다. 그러나, 장면(scene)는 이미 법선 지오메트리를 사용해 렌더링 되고 있으므로, 일부의 픽셀은 그림자 볼륨을 렌더링 할 경우에 Z 버퍼 테스트에 합격하지 않는다. 스텐실 버퍼에 남은 값이, 그림자안의 픽셀에 대응한다. 모든 것을 포함한 큰 사각형을 장면(scene)에 알파 혼합 할 경우에, 이 남은 스텐실 버퍼의 내용이 마스크로서 사용된다. 스텐실 버퍼를 마스크로서 사용하면 그림자안에 있는 픽셀이 어두워진다.
즉, 그림자의 지오메트리는 광원 마다 2 회 드로잉(Drawing) 되기 (위해)때문에, GPU 의 정점의 드로잉(Drawing)에 관한 throughput를 압박한다. 양면 스텐실 기능은, 이 문제를 완화하기 위해서 설계되었다. 이 어프로치에서는, 이하에 나타내는 스텐실 스테이트세트가 2 개 존재한다. 1 개세트는 각각 적극적인 삼각형용으로, 이제 1개는 퇴행적인 삼각형용이다. 이것에 의해, 1 개의 볼륨과 1 살의 라이트에 대해, 단일의 패스로 드로잉(Drawing) 할 수 있다.
애플리케이션 프로그래밍 인터페이스 (API)의 변경은, 새로운 렌더링 스테이트세트에 제한되고 있다. 새로운 렌더링 스테이트 D3DRS_TWOSIDEDSTENCILMODE 는 TRUE 또는 FALSE 로 설정할 수 있다. 디폴트에서는 false 로, 현재의 Microsoft® DirectX® 8. x 의 동작을 의미한다. 이것을 TRUE 로 설정 하면 (D3DSTENCILCAPS_TWOSIDED 가 설정되어 있는 경우만 기능한다), 다음의 렌더링 스테이트는 적극적인 (시계회전의) 삼각형에만 적용된다.
렌더링 스테이트 | 설명 |
---|---|
D3DRS_STENCILFAIL | 스텐실 테스트에 실패했을 경우에 실행하는 D3DSTENCILOP. |
D3DRS_STENCILZFAIL | 스텐실 테스트에 패스해, Z 테스트에 실패했을 경우에 실행하는 D3DSTENCILOP. |
D3DRS_STENCILPASS | 스텐실 테스트와 Z 테스트의 양쪽 모두에 패스했을 경우에 실행하는 D3DSTENCILOP. |
D3DRS_STENCILFUNC | D3DCMPFUNC 함수. 스텐실 테스트는, ((ref & mask) stencilfn (stencil & mask))가 true 의 경우는 패스한다. |
새로운 렌더링 스테이트세트는, 퇴행적인 (반시계회전의) 삼각형에 적용된다.
렌더링 스테이트 | 설명 |
---|---|
D3DRS_CCW_STENCILFAIL | 스텐실 테스트에 실패했을 경우에 실행하는 D3DSTENCILOP. |
D3DRS_CCW_STENCILZFAIL | 스텐실 테스트에 패스해, Z 테스트에 실패했을 경우에 실행하는 D3DSTENCILOP. |
D3DRS_CCW_STENCILPASS | 스텐실 테스트와 Z 테스트의 양쪽 모두에 패스했을 경우에 실행하는 D3DSTENCILOP. |
D3DRS_CCW_STENCILFUNC | D3DCMPFUNC 함수. 스텐실 테스트는, ((ref & mask) stencilfn (stencil & mask))가 true 의 경우는 패스한다. |
나머지의 스텐실 렌더링 스테이트는, 항상 시계회전의 삼각형과 반시계회전의 삼각형의 양쪽 모두에 적용된다.
D3DRS_TWOSIDEDSTENCILMODE 는, 라인 및 포인트 스프라이트에 대해서는 무시된다. 즉, 그 동작은 DirectX 8. x 로부터 변경되지 않다. D3DRS_CCW_STENCIL* 렌더링 스테이트는 무시된다.
새로운 능력 비트는, 장치가 이 기능을 지원 하고 있을지 어떨지를 나타낸다. 이 기능을 지원 하고 있지 않는 드라이버는, 이러한 새로운 렌더링 스테이트를 무시할 것이다. 그 외의 모든 스텐실 능력 비트는, 양쪽 모두의 모드의 스텐실 버퍼링에 적용된다. TWOSIDEDSTENCIL 은, D3DCULLMODE_NONE 를 설정해 드로잉(Drawing) 하는 능력을 암시하므로, 드라이버가 이 새로운 스텐실 모드를 지원 하고 있는 경우는, 드라이버가 대응하는 능력 비트를 설정할 필요가 있다. Microsoft Windows® Hardware Quality Labs (WHQL)에서는, 이것을 요건으로 하고 있다.
새로운 렌더링 스테이트
D3DRS_TWOSIDEDSTENCILMODE // BOOL (default is FALSE) D3DRS_CCW_STENCILFAIL // Same default as D3DRS_STENCILFAIL D3DRS_CCW_STENCILZFAIL // Same default as D3DRS_STENCILZFAIL D3DRS_CCW_STENCILPASS // Same default as D3DRS_STENCILPASS D3DRS_CCW_STENCILFUNC // Same default as D3DRS_STENCILFUNC
새로운 능력
D3DSTENCILCAPS_TWOSIDED // a flag on D3DCAPS9.StencilCaps