다음을 통해 공유


양면 스텐실(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