ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 16. 스탠실 ( Stencil )
    Software/DirectX 2024. 5. 24. 10:14
    728x90

    Table of Contents

    1. 스탠실 버퍼(Stencil buffer)

    2. 거울 그리기

    3. 그림자 그리기





     

    1. 스탠실 버퍼(Stencil buffer)
    • 스탠실 버퍼는 깊이버퍼와 함께 후면 버퍼에 기록될 픽실을 선별하는 버퍼 중 하나이다.
    • 스탠실 버퍼는 후면 버퍼와 1:1로 대응된다.(하나의 텍스쳐 이다)
    • 뎁스-스탠실 버퍼는 프레임마다 재설정해야하므로 프레임 시작에서 ClearDepthStencilView매서드를 실행시켜야한다.
    • 깊이 판정 이전에 스탠실 판정단계에서 걸러지는 픽셀들은 후면버퍼의 렌더에서 배제시킨다.(설정에 따라 깊이 판정을 무시할 수도 있다)
    • 스탠실 판정 단계에서는 후면버퍼의 특정영역만 렌더링에서 배제시킬 수 있다.






     

    2. 거울 그리기
    1. 후면 버퍼와 대응되는 스탠실 버퍼를 생성한다.
    2. 후면 버퍼에 거울을 제외한 나머지 영역을 렌더링 한다
    3. 스탠실 버퍼에 거울을 렌더링하고 해당 영역만 StencilRef: 1로 설정한다.
    4. 스탠실 버퍼의 거울에 반사된 가시적인 부분의 픽셀들을 그린다
    5. 거울에 반사될 사물을 후면버퍼와 스탠실 버퍼에 렌더링한다.
    6. 거울 자체를 후면 버퍼에 렌더링한다. 이 때 거울이 불투명 하면 거울의 깊이가 커서 반사된 상을 다 가린다. 따라서 거울 자체의 색상은 반투명하게 그려야한다.






     

    3. 그림자 그리기
    • 그림자 표현을 하는 과정에서 이중 혼합의 문제가 발생한다
    • 이중 혼합은 그림자가 발생하는 물체가 겹쳐서 그림자의 색이 특정부분 더 짙어지는 현상이다
    • 스탠실 버퍼를 이용해서 이를 해결할 수 있다.
    1. 그림자 그릴 스탠실 버퍼 픽셀들을 0으로 지운다
    2. 스탠실 버퍼 0인 픽셀만 판정 성공하도록 스탠실 설정한다
    3. 판정 성공시에 1로 바꾼다
    4. 같은 위치에 다른 그림자가 들어와도 이미 1이므로 그리기 실패한다.
    • 위와 같은 방법으로 이중 그림자 그리기를 회피할 수 있다.






    728x90

    'Software > DirectX' 카테고리의 다른 글

    18. 계산 쉐이더 ( Compute shader )  (0) 2024.05.24
    17. 기하 쉐이더 ( Geometry shader )  (0) 2024.05.24
    15. 블렌딩 ( Blending )  (1) 2024.05.24
    14. 텍스쳐 ( Texture )  (0) 2024.05.24
    13. 빛  (0) 2024.05.24