Unity의 Metallic은 무엇일까?
2026년 1월 19일80#Unity #Shader #Lighting

유니티의 Metallic 수치에 따른 빛의 영향 대한 질문을 최근에 들었어서 나도 정리 겸 포스트를 남긴다.
물론 나도 정확하게 알지는 못한다.
우선 Metallic에 대한 이해를 하기 전에 빛에 대한 이야기를 해야 한다.
빛은 직진하는 성질이 있고, 이것을 '빛의 직진성' 이라고 한다. 하지만 빛이 뻗어지다 어떤 물체를 부딫히게 되면 반사를 하게 된다. 이 때 빛은 물체의 면과 수직인 법선을 기준으로 입사각과 반사각은 같게 된다.
물체의 면이 매우 고르다면 물체면의 법선은 늘 평행할 것이기에, 빛도 일관적인 방향으로 반사한다. 하지만 물체의 면이 고르지 않다면, 각 빛을 받는 면마다의 법선은 다르게 그어질 것이고, 결론적으로 빛은 랜덤하게 반사를 하게 된다. 결론적으로 빛이 물체를 만났을 때 물체의 표면이 고르냐 고르지 않냐에 따라 반사되는 빛이 다르게 움직인다는 것이다. 전자의 경우에는 정직하게 반사해서 정반사, 후자의 경우에는 난잡하게 반사해서 난반사다(진짜 어지러울 정에, 어지러울 난이다).
대부분의 물체는 완전히 정반사하거나 완전히 난반사하는 극단적인 존재가 아니다. 현실의 재질은 정반사와 난반사가 섞여 있으며, 그 비율에 따라 금속처럼 보이기도, 플라스틱처럼 보이기도 한다. 일반적으로 난반사 성향이 센 재질은 비금속, 정반사 성향이 센 재질은 금속이기에 비금속형, 금속형으로 불리기도 한다.
이제 이 지점에서 Unity의 Metallic 이야기를 할 수 있다.
Metallic = 0
비금속 (Dielectric)
빛의 난반사(Diffuse) 성분이 큼
Metallic = 1
금속 (Metal)
빛의 정반사(Specular) 성분이 대부분
Unity의 라이팅은 물리 기반 렌더링(PBR)을 따르며,
그 핵심 원칙 중 하나가 에너지 보존 법칙이다.
따라서 Metallic 값이 올라가면:
난반사(Diffuse)에 사용할 수 있는 에너지 감소
정반사(Specular)에 할당되는 에너지 증가
라는 결괏값이 나온다.
유니티에 존재하는 간접광은 여러가지가 있는데 그중 Lightmap, Light Probe(혹은 APV), Reflection Probe, Environment Reflection(Environment 탭의 그것, 기본값은 스카이박스다)이다.
여기서 Lightmap, Light Probe는 diffuse의 성향을 띠고, reflection Probe, Environment Reflection은 specular의 성향을 띈다
Metallic의 낮을 수록 Lightmap, Light Probe의 힘이 강해지고, 높을수록 Reflection Probe, Environment Reflection의 힘이 강해진다.
최종 간접광 = (Lightmap 밝기 × (1 - Metallic)) + (Reflection 밝기 × Metallic)
물론 유니티 내부 계산식은 복잡하지만 간접광에 한해서 이해하기에는 적절한 식이다.
근데 메탈릭은 난반사와 정반사의 세기를 조절한다는 개념으로 봐야 하는데 실질적으로 보면 유니티에서는 약간은 다른 개념을 이원화하여 그것을 컨트롤하고 있다 그것은 왜 그럴까?
물론, 당연히 엔진의 한계 때문이겠지만, 조금만 추측을 해보자면 난반사는 물체의 원색을 많이 나타낸다. 따라서 주변이 얼마나 밝은가에 대한 것이 조금 더 중요하다고 볼 수 있다. 하지만, 정반사의 경우에는 특정 방향의 환경을 정확하게 반사하는 것이기 때문에 밝기도 중요하지만, 어떤 빛을 비추는가가 조금 더 중요하다고 볼 수 있겠다. 따라서 밝기의 정보를 많이 가지는 Lightmap, Light Probe가 난반사의 역할을 갖고, 환경에 대한 정보를 가지는 Reflection Environment, Reflection Probe를 정반사의 역할을 갖도록 단순화하였을 것이다라는 생각이다. 물론, 유니티에는 Metallic뿐만 아니라 Smoothness라는 파라미터까지 있어서 많이 복잡하긴 할 것이다.
이리저리 알아본 Metallic 과 Idirect Light에 관련한 공식들
IndirectDiffuse =
kD × DiffuseColor × Irradiance(Lightmap / Probe)
IndirectSpecular =
SpecularColor × PrefilteredReflection(Reflection Probe / Environment) × BRDF_LUT
DiffuseEnergy = (1 - Metallic)
SpecularEnergy = Metallic
SpecularColor = lerp(0.04, Albedo, Metallic)
DiffuseColor = Albedo × (1 - Metallic)
FinalLighting = (1 - Metallic) × Albedo × IndirectDiffuseSource + SpecularColor × IndirectSpecularSource
정리하자면 Unity의 Metallic은 Diffuse와 Specular 에너지를 (1 − M) : M 비율로 분배하고,
Albedo를 Diffuse 색에서 Specular 색으로 이동시키는 파라미터다.
태그
#Unity#Shader#Lighting
관련 포스트
Unity 카테고리의 다른 글
