본문 바로가기
자료는 자료지/외부에서 퍼온자료

6. ASE를 활용한 마법의 거울(포탈) 효과 구현하기

by 대마왕J 2026. 1. 5.



이번 시간에는 1장을 마무리하며 스텐실 테스트(Stencil Test)와 뎁스 테스트(Depth Test)에 관한 지식을 중점적으로 살펴보겠습니다
. 마법의 거울 사례를 통해 셰이더 과정, 스텐실 테스트, 뎁스 테스트, 렌더 큐(Render Queue) 등 전반적인 렌더링 메커니즘을 더 깊이 이해하는 것이 목표입니다.

마법의 거울 효과는 거울의 평면을 통해서만 내부의 세계를 관찰할 수 있는 기술입니다. 내부 모델은 실제로 존재하지만 특정 표면을 통해서만 보이며, 현실 세계의 모델과 교차하더라도 서로 영향을 주지 않습니다. 이는 특정 구역에 마스크(Mask)를 그리는 스텐실 테스트 기술을 주로 사용하며, 깊이 쓰기 및 렌더 큐 설정을 조정해 물체 간의 충돌 문제를 처리합니다.

스텐실 테스트는 출력 병합(Output Merger) 단계에서 알파 테스트 이후, 뎁스 테스트 이전에 발생합니다. 스텐실 버퍼라는 구역에 특정 값을 설정하고, 정해진 규칙을 통과한 픽셀만 화면에 렌더링하며 버퍼 값을 업데이트하는 방식입니다

1. 스텐실 테스트의 이해

스텐실 테스트는 화면의 특정 영역을 마스킹하는 기술입니다. GPU 파이프라인의 출력 병합 단계에서 수행되며, 0~255 사이의 값을 가진 스텐실 버퍼를 활용합니다.

 
  • 작동 원리: 특정 물체가 그려질 때 스텐실 버퍼에 값을 기록하고, 이후에 그려질 물체는 그 값을 참조하여 렌더링 여부를 결정합니다.

2. 거울 평면(마스크) 셰이더 설정

가장 먼저 거울 영역을 마스크로 지정해야 합니다. ASE의 스텐실 버퍼(Stencil Buffer) 옵션에서 다음과 같이 설정합니다.

 
  • Reference: 1 (기준값을 1로 설정)
  • Comparison Function: Always (항상 테스트를 통과시켜 버퍼에 기록)
  • Pass Operation: Replace (테스트 통과 시 버퍼 값을 Reference 값인 1로 교체)
  • Color Mask: 모든 채널 체크 해제 (색상은 출력하지 않고 스텐실 값만 기록하여 투명하게 만듦)


3. 거울 속 세계(내부 물체) 셰이더 설정

이제 거울 안쪽에서만 보일 물체들의 셰이더를 설정합니다. 이 물체들은 스텐실 버퍼 값이 1인 영역에서만 그려져야 합니다.

  • Reference: 1
  • Comparison Function: Equal (스텐실 버퍼 값이 1인 경우에만 렌더링)


4. 렌더 큐(Render Queue)와 깊이 제어

물체가 그려지는 순서는 매우 중요합니다. 거울 평면이 먼저 그려져서 스텐실 버퍼를 채워야 내부 물체가 이를 참조할 수 있습니다.

  • 거울 평면(마스크): Render Queue를 Geometry-1 (1999)로 설정하여 가장 먼저 그려지도록 합니다.
  • 내부 물체: Render Queue를 Geometry (2000) 이상으로 설정합니다.

5. 프레임 디버거(Frame Debugger)를 통한 최적화

설정이 끝난 후 효과가 제대로 나오지 않는다면 유니티의 Frame Debugger를 사용해야 합니다. 각 단계에서 어떤 셰이더가 사용되는지, 스텐실과 뎁스 설정이 어떻게 변하는지 실시간으로 확인할 수 있습니다.


6. 현재 방식의 한계점

이 방식은 간단하지만 몇 가지 한계가 존재합니다.

  1. 관통 문제: 물체가 거울 평면을 직접 뚫고 나오는 물리적 교차를 완벽하게 처리하기 어렵습니다.
  2. 그림자 처리: 거울 내부의 물체가 거울 외부의 현실 세계에 그림자를 드리우는 등의 상호작용 처리가 복잡합니다.

이 실습을 통해 렌더링 파이프라인에서 스텐실 테스트가 어떻게 공간을 분리하는지 이해하셨기를 바랍니다. 다음에는 더 심화된 렌더링 기법을 다뤄보겠습니다.

반응형

댓글