Shader

[Shader] OPaque Error with Unlit Shader (불투명 쉐이더 문제)

HungryK 2025. 4. 25. 03:15

공부용으로 작성되는 페이지입니다. 틀린 부분이나 환경에 따라 오류가 발생할 수 있습니다. 

 


 

 

스터디 피드백을 해주던 도중 생긴 문제를 해결했던 것을 기록한다.

 

결론부터 말하자면 '오브젝트를 페이드 아웃 시키는 fade-out shader, 즉 Transparent가 Unlit Shader에서 적용되지 않는 문제가 발생했었고 이를 해결했었다. 이 이야기를 하면서 ZBuffer 및 알파 블렌드(Alpha Blend)에 대해서도 같이 작성하며 알파를 다루기 전 알아야할 이론을 공부했다. 교재나 웹사이트를 참고하며 정리한거기에 다소 난잡할것이다. 

 

 

Z Buffer?

Z Buffer는 깊이 Buffer라고도 부르며, 이름 그대로 화면 기준에서 '깊이값'이 얼마인지 저장하고 있는 Buffer이다.

X축과 Y축만이 존재하는 평면 공간과 달리 3D 공간에서는 Z라는 'Depth'가 존재하기 때문에 필수적인 존재로, 특히 겹치는 오브젝트가 있을 경우 Z Buffer가 중요하다. 일러스트 툴을 다뤄본 사람이라면 레이어 개념으로 생각하면 된다. 

 

 

물체가 겹친 경우, 각각 Z Buffer에 따라 앞 뒤 판정을 한다. 만약 Z Buffer가 없다면 어느 오브젝트가 먼저인지 구분이 불가능해질 것.

 

특히 컴퓨터 그래픽스는 계산을 먼저 마친 순서대로 화면상에 그려지기 때문에, 고유 Depth값이 없으면 매번 결과물이 엉망진창 나올 것이다...

 

Alpha Blend

알파 블렌딩이란 반투명을 물체들의 색을 보간하여 최종 색상을 결정하는 것이다.

 

현실에서도 반투명 재질끼리 겹치면 당연하게도 눈에 보이는 색이 달라진다

 

위에서 언급했던 Depth값으로 인한 문제를 방지하기 위해서 Alpha Blending 관련 렌더링에는 규칙이 있다.

 

1. 불투명 오브젝트 먼저 렌더링 

2. 반투명 오브젝트는 후 렌더링

3. 반투명 오브젝트의 경우 원경 먼저 렌더링 (Alpha Sorting) 

 

다만 카메라 기준 거리를 기반으로 작동하는 Alpha Sorting의 특성상 항상 완벽하게 앞뒤를 판정할 수는 없다. 이를 해결하기 위해서 오브젝트 자신의 위치값을 입력하지 않는다는 의미에서 zwrite off가 사실상 항상 같이 쓰인다.

 

드디어 zwrie off가 쓰이는 이유를 이해했다.

 

 

 

Fight With Error : 불투명도 쉐이더가 먹히질 않는다! 

 

 

글의 서두에서 이야기 했던 오브젝트를 페이드 아웃 시키는 fade-out shader, 즉 Transparent가 Unlit Shader에서 적용되지 않는 문제를 다시 보자. 이 문제의 답은 생각보다 명확했는데, 바로 Unlit Shader에서는 Alpha Blend를 지원하지 않기 때문이었다.

 

 

 

Unlit Shader에서 해결하기 위해 여러 방법을 써봤으나 결론적으로는

Standard Unlit - Blend mode : Premultiplied Alpha(4)로 설정해서 해결했다.

찾아보니 Standard Unlit Shader는 유니티에서 공식적으로 명시해둔 쉐이더는 아니었고, Alpha blending이 가능하도록 편집해둔 Unlit Shader 라고 생각하면 된다. 

 

 

 

 참고 자료

Alpha Transparency with an Unlit Shader : r/Unity3D

 

From the Unity3D community on Reddit

Explore this post and more from the Unity3D community

www.reddit.com

렌더링 모드 - Unity 매뉴얼

 

렌더링 모드 - Unity 매뉴얼

스탠다드 셰이더의 첫 번째 Material 파라미터는 Rendering Mode입니다. 렌더링 모드에서 오브젝트의 투명도 사용 여부와, 사용하는 경우 사용할 블렌딩 모드 타입을 선택할 수 있습니다.

docs.unity3d.com