250116

Errata·2025년 1월 16일

개발 일지

목록 보기
53/350

✅ 오늘 한 일


  • 대마왕의 유니티 URP 셰이더 그래프 읽기


📖 대마왕의 유니티 URP 셰이더 그래프


Part 20 | 응용하기

01 투명해지는 오브젝트 만들기

하프톤 디더링으로 투명해지게 만들기

게임 오브젝트가 사라지게 해야할 때가 있다.
먼저 패턴 디더링(Pattern Dithering) 방법이 있다. 망점으로 서서히 사라지는 기법이다.
망점을 이용하는 방법은 망점 텍스쳐를 이용하는 방법과 연산으로 만드는 방법이 있다.
Shader Graph에는 간편하게 연산으로 만들 수 있는 Dither 노드가 들어있다.

Dither 노드

  • in값을 0에서 1사이의 값으로 조절해보면 1에 가까워질수록 망점이 점점 생긴다
  • UV는 화면 그 자체를 UV로 사용하는 Screen Position이다.

  • Graph Settings > Alpha Clipping 활성화
  • Dither 노드를 Alpha에 연결
  • Float Slider 프로퍼티를 만들고 Dither의 In에 연결

깨끗한 반투명으로 사라지게 만들기

점박이로 사라지지 않고 깨끗하게 투명하게 사라지게 만들기 : 알파 블렌딩

  • Graph Settings > Surface Type > Transparent
  • Alpha에 0에서 1 Slider 만들기

이렇게 하면 점박이는 없어지지만, 앞뒤 문제가 발생하고 뒤에 있는 오브젝트가 겹쳐 보이면서 지저분해진다.

비용이 들지만, 2Pass로 더 깨끗하게 사라지는 반투명을 만들 수 있다.
Custom Renderer Feature를 이용하여 투명하지만 Z write를 하는 오브젝트를 먼저 그리고, 그 위에 다시 반투명 오브젝트를 그리면 된다.

  1. 보이지는 않지만 Z값을 쓰기만 하는 오브젝트를 만든다. 이 오브젝트를 그리는 순서는 Opaque(불투명) 다음에 Transparent(반투명)이 그려지기 직전.
  • 새 Unlit Shader와 Material 만들고 DepthOnly로 명명
  • Graph Settings에서 Surface Type은 Transparent, Depth Write는 Force Enabled
  • Screen Position을 연결한 Screen Color를 Base Color에 연결

이렇게 되면 Z값을 쓴 오브젝트가 그려지긴 하지만, 배경을 캡쳐한 이미지를 그대로 덧씌워 마치 투명 망토처럼 보이지 않게 된다.
코드로는 ColorMask 0로 그려지지 않게 할 수 있지만, 노드에는 해당하는 기능이 없어서 이렇게 한 것.

  1. 여기에 반투명으로 오브젝트를 그린다. 이전에는 반투명으로 그릴 때 앞뒤 판정이 안되어서 뒷면에 있는 것까지 그려졌다면, 지금은 Z값이 이미 쓰여있기 때문에 뒤에 있는 것은 그려지지 않는다.
  • 오브젝트의 머테리얼을 처음 만들었던 알파 블렌딩 적용된 (그리는 순서 문제는 있는) 머테리얼로 교체한다
  • 오브젝트에 Layer를 설정한다
  • 프로젝트 뷰 > Asset > Settings에서 현재 사용하고 있는 URP Asset 선택하고 Opaque Texture 체크
  • URP Asset에 적용된 Renderer을 선택하고 Add Renderer Feature > Render Objects
    • Event : 그려질 순서. Before Rendering Transparents로 설정한다.
    • Queue : Transparent
    • Layer Mask : 오브젝트에 설정했던 Layer
    • Material : 보이지는 않지만 Z 버퍼에 값을 쓰는 DepthOnly 머테리얼 설정

과정 정리

  1. 배경을 그린다 (Opaque 다음에 Skybox가 그려짐. Opaque Texture에 현재 상태가 캡쳐됨.)
  2. Transparent가 그려지기 직전에 Renderer Feature가 실행되고, 보이지는 않지만 Z 값을 쓴 레이어 오브젝트가 그려진다.
  3. 반투명 오브젝트가 그려진다. Z 값이 로봇 모양으로 쓰여져 있기 때문에, 뒤에 가려진 면은 보이지 않게 된다.

(평소에는 일반 셰이더를 쓰다가, 투명해져야 할 때 이 셰이더로 교체하면 됨)

더 투명하고 안 보이게 만들기

  • Smoothness 떨어뜨려서 정반사를 줄여서 눈에 덜 띄게 만들기
  • Unlit으로 바꿔서 빛과의 상호작용 없애기

Opaque Texture?
Opaque(불투명 오브젝트)가 다 그려진 후 그려진 이미지(프레임 버퍼)를 저장해 놓는 것.
쉽게 말하면, 계속 스크린샷을 찍어서 갖고 있는 것. 아직 Transparent 오브젝트들은 그려지지 않았기 때문에 찍혀있지 않다.
가벼운 기능은 아니므로 타협하면서 사용할 필요가 있다.

profile
Penser, c'est réapprendre à voir

0개의 댓글