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_STENCILFUNCD3DCMPFUNC 함수. 스텐실 테스트는, ((ref & mask) stencilfn (stencil & mask))가 true 의 경우는 패스한다.

새로운 렌더링 스테이트세트는, 퇴행적인 (반시계회전의) 삼각형에 적용된다.

렌더링 스테이트설명
D3DRS_CCW_STENCILFAIL스텐실 테스트에 실패했을 경우에 실행하는 D3DSTENCILOP.
D3DRS_CCW_STENCILZFAIL스텐실 테스트에 패스해, Z 테스트에 실패했을 경우에 실행하는 D3DSTENCILOP.
D3DRS_CCW_STENCILPASS스텐실 테스트와 Z 테스트의 양쪽 모두에 패스했을 경우에 실행하는 D3DSTENCILOP.
D3DRS_CCW_STENCILFUNCD3DCMPFUNC 함수. 스텐실 테스트는, ((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

관련 항목



© 2002 Microsoft Corporation. All rights reserved.
↑TOP