다음을 통해 공유


Two-Sided 스텐실(Direct3D 9)

섀도 볼륨은 스텐실 버퍼를 사용하여 그림자를 그리는 데 사용됩니다. 애플리케이션은 기하 도형을 폐색하고 실루엣 가장자리를 계산하고 조명에서 3D 볼륨 세트로 압출하여 캐스팅된 섀도 볼륨을 계산합니다. 그런 다음 이러한 볼륨은 스텐실 버퍼에 두 번 렌더링됩니다.

첫 번째 렌더링은 전방 다각형을 그리고 스텐실 버퍼 값을 증가합니다. 두 번째 렌더링은 그림자 볼륨의 후면 다각형을 그리고 스텐실 버퍼 값을 감소합니다. 일반적으로 증가된 값과 감소된 모든 값은 서로를 취소합니다. 그러나 이 장면은 이미 일반 기하 도형으로 렌더링되어 일부 픽셀이 섀도 볼륨이 렌더링될 때 z 버퍼 테스트에 실패했습니다. 스텐실 버퍼에 남아 있는 값은 그림자에 있는 픽셀에 해당합니다. 이러한 나머지 스텐실 버퍼 콘텐츠는 마스크로 사용되어 크고 모든 것을 포괄하는 검은색 쿼드를 장면에 알파 혼합합니다. 스텐실 버퍼가 마스크로 작동하면 그림자에 있는 픽셀이 어둡게 됩니다.

즉, 그림자 기하 도형은 광원당 두 번 그려지므로 GPU의 꼭짓점 처리량에 압력을 가합니다. 양면 스텐실 기능은 이러한 상황을 완화하도록 설계되었습니다. 이 방법에서는 두 개의 스텐실 상태 집합(아래 명명됨)이 있으며, 하나는 앞면 삼각형에 대해 각각 설정되고 다른 하나는 후면 삼각형에 대해 설정됩니다. 이렇게 하면 조명당 그림자 볼륨당 하나의 패스만 그려집니다.

API 변경 내용은 새 렌더링 상태 집합으로 제한됩니다. 새 렌더링 상태 D3DRS_Two_Sided_StencilMODE TRUE 또는 FALSE 설정할 수 있습니다. 기본적으로 FALSE 현재(DirectX 8) 동작을 의미합니다. TRUE 설정되면(D3DSTENCILCAPS_TWOSIDED 설정된 경우에만 작동함) 다음 렌더링 상태는 전면(시계 방향) 삼각형에만 적용됩니다.

렌더링 상태 묘사
D3DRS_STENCILFAIL 스텐실 테스트가 실패하는 경우 수행할 D3DSTENCILOP.
D3DRS_STENCILZFAIL 스텐실 테스트가 통과하고 z 테스트가 실패하는 경우 수행할 D3DSTENCILOP.
D3DRS_STENCILPASS 스텐실과 z-테스트가 모두 통과하면 수행할 D3DSTENCILOP.
D3DRS_STENCILFUNC D3DCMPFUNC fn. ((ref & mask) stencilfn(스텐실 & 마스크)이 true이면 스텐실 테스트가 통과합니다.

 

새 렌더링 상태 집합은 역방향(시계 반대 방향) 삼각형에 적용됩니다.

렌더링 상태 묘사
D3DRS_CCW_STENCILFAIL 스텐실 테스트가 실패하는 경우 수행할 D3DSTENCILOP.
D3DRS_CCW_STENCILZFAIL 스텐실 테스트가 통과하고 z 테스트가 실패하는 경우 수행할 D3DSTENCILOP.
D3DRS_CCW_STENCILPASS 스텐실과 z-테스트가 모두 통과하면 수행할 D3DSTENCILOP.
D3DRS_CCW_STENCILFUNC D3DCMPFUNC 함수입니다. ((ref & mask) stencilfn(스텐실 & 마스크)이 true이면 스텐실 테스트가 통과합니다.

 

나머지 스텐실 렌더링 상태는 항상 시계 방향 및 시계 반대 방향으로 삼각형에 적용됩니다.

선 및 점 스프라이트의 경우 D3DRS_Two_Sided_StencilMODE 무시됩니다. 즉, 동작이 DirectX 8에서 변경되지 않습니다. D3DRS_CCW_STENCIL* 렌더링 상태는 무시됩니다.

새 캡 비트는 디바이스가 이 기능을 지원하는지 나타냅니다. 이 기능을 지원하지 않는 드라이버는 이러한 새 렌더링 상태를 무시해야 합니다. 다른 모든 스텐실 캡 비트는 스텐실 버퍼링의 두 모드에 모두 적용됩니다. Two_Sided_Stencil D3DCULLMODE_NONE 집합으로 그리는 기능을 의미하므로 이 새 스텐실 모드를 지원하는 경우 드라이버에서 해당 캡을 설정해야 합니다. Microsoft WHQL(Windows Hardware Quality Labs)은 이를 적용해야 합니다.

새 렌더링 상태:

D3DRS_Two_Sided_StencilMODE // 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

스텐실 버퍼 기술

D3DRENDERSTATETYPE