PBR에서 메탈릭은 0과 1로만 두는 것이 정법이다. 0이나 1사이 값을 사용하지 말라는 가이드를 하기도 하는데 현실적으로나 물리적으로나 그렇게 옳은 가이드라고만 하긴 힘들다. 메탈릭을 무분별하게 0과 1사이의 값을 사용하는 것은 문제가 있지만 메탈릭을 0 혹은 1으로만 제한을 둘 경우에도 여러 현실적인 한계에 부딫힌다. 여기서는 메탈릭 값에 대한 현실적인 의미와 물리적인 의미를 통해 몇가지 메탈릭에 관한 사용법을 다뤄보겠다.

글은 세 파트로 두었다.

  1. 메탈릭을 0 혹은 1로만 두는 이유
  2. 실시간 PBR의 한계
  3. 블렌딩과 마이크로 픽셀
  4. 마무리 및 권장 사용법

3번이 이 글에서 강조하고 싶은 내용이다.

1. 메탈릭을 0 혹은 1로만 두는 이유

먼저 메탈릭을 0 혹은 1로 제한을 거는 이유부터 살펴보자. 이러한 제약의 이유를 가장 원론적으로 말하자면 실제로 금속 재질은 완전히 금속이거나 금속이 아니거나 하는 두 종류만 존재하기 때문이다. 반만 금속인 건 일반적으로 없다1.

비금속의 경우 메탈릭은 그냥 0으로 두는 것이 정석이다. 하지만 비금속에 메탈릭을 살짝 올릴 경우는 아티스트 손에서 흔하게 발생한다. 아티스트가 메탈릭을 올리는 이유는 대부분 스페큘러가 강해지고 더 좋게 보이기 때문이다. 사용할 수 있는 폴리곤 수의 제약, 실시간 GI의 한계로 밋밋해 보이는 물체(PBR을 따른 물체는 대체적으로 밋밋해보인다)를 입체감있게 만들기에는 메탈릭을 사용하는 것은 유혹적인 방식이다2.

게임은 어차피 가상의 광원을 많이 추가하기도 하니 단순히 스페큘러만 강하게 보인다면 큰 문제가 없을 수도 있다. 물체의 음영이 커져서 더 괜찮아보이는 착각이 생길 수도 있는데 메탈릭이 들어간다는건 디퓨즈 성분이 줄어든다는 의미고, 이것은 결국 (디퓨즈) GI가 어두워지는 결과로 이어진다. 좀 더 쉽게 말해서 비금속에 메탈릭을 올려버리면 어두운 곳에서 지나치게 어두워질 수 있다. 또한 상대적으로 강해진 스페큘러 때문에 베이스 컬러를 약하게 주는 경우로 이어지기도 한다. 다시 말해 메탈릭을 꼼수로 올린다면 다른 꼼수로 메꿔야 하는 상황이 생기고 이러한 꼼수만으로는 모든 상황을 다 대처하진 못하기 때문에 예상치 못하는 문제가 생길 수 있다.

그러면 메탈릭은 0이나 1로만 두고 그 사이 값은 절대 사용하면 안되는 것일까? 프로그래머 입장에서 아티스트에게 그렇게 가이드하면 해결 되는 것일까? 물론 그렇지 않다. 만약 그랬다면 UE4 같은 엔진에서 굳이 0과 1사이의 값을 넣도록 하지 않았을 것이다. 실제로 0과 1사이의 값을 사용하는 것이 때로 물리적으로 맞기도 하다. 그것을 설명하는 것이 이 글의 진짜 취지다.

2. 실시간 PBR의 한계

일단 실시간 PBR은 완벽하지가 않다. 현실적으로 몇가지 제약들이 많이 숨어 있다. 여기서는 다이아몬드를 예로 들겠다. 다이아몬드는 비금속인데 (UE4 기준으로 보면) 물리적으로 제대로 표현할 수 없다.

첫번째 한계는 (UE4 기준으로) 반사율을 올바르게 표현할 수 없다는 점이다. 다이아몬드는 굴절률(refractive index)이 2.42 정도 된다.

UE4에서 반사율은 머티리얼 노드에서 specular 핀 값에 0~1의 값을 넣는 것으로 조절하는데, 스페큘러 0은 0% 반사를 의미하고, 스페큘러 0.5(기본값)는 4%의 반사율, 스페큘러 1은 8%의 반사율을 의미한다. 다이아몬드는 17%의 반사율을 지니므로 스페큘러 값이 2.15가 되어야 한다(참고: 언리얼 엔진의 PBR 스페큘러 기본값 0.5의 의미). 이것은 UE4 에서 입력할 수 있는 메탈릭 범위를 넘어간다.

두번째 한계는 반투명의 한계다. 보석은 반사율이 굉장히 높아보이는데 위에서 언급한대로 17% 밖에 안된다. 그럼에도 불구하고 반짝이고 반사를 잘하는 것처럼 보이는 이유는 투과를 같이 하기 때문이다. 투과를 한 것이 일부는 반사를 하고 일부는 또 투과를 하니 결과적으로 반사율이 높아 보이는 것이다. 이런걸 전부 표현할 수 없는 이상 다이아몬드를 비금속으로 두고 정법으로 풀기에는 다소 한계가 있다. 제대로 된 투과와 굴절을 표현할 수 없을 바에야 차라리 메탈릭을 통해 반사율을 높이는게 다이아몬드를 표현하기에 더 좋을 수도 있다.

그렇다면 실시간 PBR로 풀 수 없는 물체에만 예외로 두면 될까 하는 물음을 하게 된다. 그 역시 그렇지 않다. PBR로 풀 수 있는 보편적인 물체에 대해서도 0과 1사이의 메탈릭을 사용하는 상황이 생긴다.

3. 블렌딩과 서브 픽셀

금속의 경우 현실에서 100% 금속만 ‘보이는’ 경우는 무척 드물다. 순수 100% 금속일지라 하더라도 현실에서는 녹이 슬거나 먼지가 쌓인다.

그림 1. 녹슨 금속
출처: Pixbay by wilhei

위와 같이 녹이 슨 금속이 있다. 녹은 금속이 아니고 녹이 슬지 않은 부분은 금속이니 우리가 무한정 정교한 텍스쳐를 만든다고 하면 비금속과 금속을 거의 완벽히 구분할 수 있다. 그런 상황에서는 메탈릭은 0과 1로 나눌 수 있다.

그림

그림

그림 2. (실제로는 불가능하지만) 무한히 확대할 수 있다면 픽셀 단위로 금속과 비금속을 분리할 수 있다.

한없이 가까이서 본다면 비금속과 금속을 구분할 수 있다고 해도 렌더링 세계에서는 해상도의 한계란게 존재한다(화면의 해상도와 텍스쳐의 해상도 모두에 대해 해당 되는 이야기다). 아래의 그림의 경우 4개의 사각형이 한개의 픽셀(텍셀)에 대응 한다.

그림

그림 3. 하나의 픽셀이 (가상의) 4개의 서브 픽셀에 해당한다.
왼쪽 그림에는 네개의 픽셀(텍셀)이 있고, 그 중 왼쪽 상단 픽셀을 확대한 것이 오른쪽 그림이다.
왼쪽: 4개의 픽셀(각 픽셀은 4등분 되어있다), 오른쪽: 4등분 된 하나의 픽셀(텍셀)

스크린의 픽셀 (혹은 텍스쳐의 텍셀) 기준으로 한 단계 멀리 떨어져서 본다면 위의 4개의 서브 픽셀 당 하나의 픽셀로 생각해야한다. 이때 픽셀은 25% 금속(회색)이고 75%는 비금속(갈색)이다. 이런 상황에서 렌더링은 메탈릭을 0.25로 두는 것이 물리적으로 올바르다.

다시 말해 해상도는 한계라는게 존재하기 때문에 한없이 구분할 수 없으므로 하나의 픽셀에 몇 퍼센트의 금속이 들어있느냐를 메탈릭으로 둔다. 이러니 당연히 0 과 1 사이의 값이 나오는 것이 자연스럽다.

금속 표면 중 일부만 녹으로 변한 상황 말고 금속에 먼지가 쌓이는 상황을 생각해보자. 아무리 금속이 있다고 해도 시간이 어느정도 지나면 먼지가 쌓이기 마련이다. 금속 가루가 떠다니는게 아니라면 일반적으로 이 먼지는 비금속이다. 금속 위 먼지 역시 무한정 고해상도인 상황에서는 먼지와 금속을 완벽하게 나눌 수 있겠다. 하지만 조금만 멀리 떨어져보면 금속 전체가 흐릿하게 보인다. 육안으로는 금속과 비금속의 입자를 구분할 수 없다. 이 경우는 그냥 금속 자체의 메탈릭을 낮추는 것이 자연스러워 보일 뿐더러 물리적으로 올바르다.

4. 마무리 및 권장 사용법

근본적인 물음은 0 혹은 1이 아닌 중간 값의 메탈릭을 사용하는 것이 물리적으로 올바른가이다.

  1. 첫번째로, 물리적으로 올바르지 않더라도 어쩔 수 없이 사용할 수 밖에 없는 경우가 제법 존재하고(다이아몬드의 예)
  2. 두번째로는 상당히 많은 상황에서는 중간 값도 물리적으로 올바르다.

그럼 어떤 경우에는 0과 1사이의 메탈릭 값을 사용해도 좋을까?

  1. 사용하는 엔진의 실시간 PBR 한계에서 원하는 표현을 정말 할 수 없을 때는 비물리적인 값을 사용할 수 밖에 없을 때가 존재한다.
  2. 금속의 메탈릭 값의 경우 약간 낮추는건 좋은 표현이다. 금속 표면에 비금속 성분이 뿌려지는건 일반적인 상황이다. 오히려 먼지 없이 100% 금속 성분만 보이는 건 엄밀하게 보면 그다지 현실적이지 않다3.
  3. 비금속 재질에 메탈릭 값을 높이는건 권장하지 않는다. 비금속 표면에 금속 가루를 뿌린다면 모르겠다. 그렇게 명백하게 금속성을 생각할 수 있는 상황이 아니라면 비금속 메탈릭 값을 올리는 것은 권장하지 않는다.
  4. 비금속 재질이 금속 재질과 블렌딩 되는 경우는 부드럽게 만들어주는 것이 자연스럽고 물리적으로 올바른 표현이다.

4.1. 여담

이 주제는 지금 UE5로 핫한 REYES(render everything your eyes saw)와 마이크로 폴리곤에 관해서도 이야기를 이어갈 수 있다. 쉽게 말하면 위에 말한 25%의 비금속, 75%의 금속의 경우 하나의 픽셀을 4개의 마이크로 폴리곤으로 나누고 각각 금속 비금속에 대해서 렌더링을 하고 4개의 결과를 하나의 픽셀로 안티얼라이어싱 하듯이 합치면 된다. 이 주제는 나의 최근 관심사인데 나중에 다시 다루도록 하겠다.


  1. 일반적으로 없다고 표현한 이유는 있긴 있다는 뜻이다. 준금속(metalloid)은 금속과 비금속으로 딱 잘라서 분류할 수가 없다. 준금속의 예로는 저마늄(germanium)과 실리콘(silcon) 등이 있다. 

  2. 아티스트가 메탈릭을 사용하는 또 다른 예로는 천 재질이다. 실제로 옷감(cloth)의 BRDF 계산은 메탈릭을 약간 올린 것으로 흉내 낼 수 있을 정도로 어느정도 흡사한면이 있는 것은 사실이다. 이 경우 옷감 BRDF를 사용하거나 (성능 등의 이유로) 메탈릭을 부분적으로 허용하는 방식으로 해결하면 되겠다. 

  3. 렌더링 계산 식에 따라 금속의 메탈릭이 1인 경우는 디퓨즈 라이팅이 0%가 된다. 스페큘러 계산의 한계에 따라 이는 다소 아쉬울 때가 존재한다. 약간 낮추어 어느정도 디퓨즈의 느낌을 주는 것도 좋을 뿐더러 실제로 메탈릭을 약간 낮추면 세월이 지난 금속의 느낌이 매우 쉽게 나타나기도 한다.