炸殺
카테고리
작성일
2020. 5. 16. 09:45
작성자
炸殺

본론부터 말하자면 이번 포스트에서는

 

기본적으로 제공되는 Standard Meterial. 

이걸 직접 만들어 봅시다!

경우에 따라 위에 있는 기능을 전부 사용하지 않을 수도, 없는 기능이 필요로 할 수 도 있을 겁니다.

필요한 기능만 쏙쏙 뽑아서 넣고싶은데.....

 

 

 

그렇다면 먼저 내가 '어떤 기능이 필요한지'를 알아야겠죠.

 

기본기를 확실하게 익히고, 자연스럽게 떠올릴 수 있을 정도로 공부해야하는 이유라고 생각합니다.

현존하는 쉐이더 코드를 몽땅 알고 있다고 해도

내가 뭘 표현하고 싶은지, 이 기능이 어떤 표현과 연결이 되는지를 알아야 커스텀 쉐이더를 짜던 할거에요.

 

 

 

그래서 대박적 지루하고 머릿속에 더럽게 안들어오지만 반복해서 공부해야하는 것이 바로,

 

빛(조명)의 이론입니다.

 

 

 

 

 

 

Lighting theory (라이팅 이론)

 

우리가 눈으로 보는 모든 사물의 색상은 에 의해서 결정됩니다.

 

 

빛이 무슨 색상을 가지고 있는지, 방향, 강도는 어떤지, 어느만큼 반사되는지, 얼마나 투과되는지....등등등. 

물체의 색상은 이처럼 빛과의 다양한 상호작용에 의해 결정되는데

같은 물건이라도 실내, 실외에 있을 때 색상이 다르고, 같은 공간이라도 어떤 조명을 사용하냐에 따라 전혀 달라보이기도 합니다.

 

이러한 빛이 없다면 어떠한 물질도 빛을 흡수하여 다시 반사, 산란 등을 할 수 없고

우리는 그 어느 것도 보지 못한 채 주변은 암흑 뿐일 겁니다.

 

 

 

게임 세계는 이러한 현실 세계를 그대로 옮기기 위해 수많은 노력을 하고있습니다.

현실보다 '더' 현실같게! 말이죠. 물론 현실에선 실현 불가능한 것이 더 아름다울 때도 있습니다.

그래픽은 예쁘게 보이는 것을 위해선 무슨 짓이던 할 준비가 되어있는 존재죠.... 예쁘게.... 절대 예쁘게......

 

현실과 똑같이 만들던, 현실과 다르게 만들던 중요한건 '빛'을 알아야한다는 겁니다! 알아야 '조작'도 할 수 있어요!

 

 

http://www.huevaluechroma.com/022.php

서양 사람들은 빛을 가져다 세분화를 시키고 이름을 지었습니다. 조명 관련 형상을 구분 지은 거죠.

이걸 하나 하나씩 엔진에서 구현 하면 현실과 똑같아져가지 않겠어요?

 

 

 

두 오브젝트의 메터리얼 설정은 같습니다. 하지만 차이는 분명히 보여요.

오른쪽의 이미지가 더 자연스럽고 예쁘다고 느껴지는 이유는 현실에 기반한 빛 연산이 더 많이 들어갔기 때문일 겁니다.

 

오른쪽에 들어간 빛 연산은 뭐고!

뭐가 없길래 왼쪽의 사진이 오른쪽에 있는 사진보다 구린지! 하나씩 알아가 봅시다. (왼쪽이 더 예쁘다고요? 그렇군요...) 

 

 

 

 

 

Digital Light

 

3D에서는 현실을 흉내내는 3가지의 조명을 만들어내었습니다.

 

https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/chapter10/chapter10.html

 

Point (Omni) Light

- 사방으로 뻗어나가는 특성을 가지고 있으며 설정한 값에 따라 감쇠 효과가 적용됩니다.


Spot Light

- 특정 방향으로 원뿔 형태의 빛을 쏘는 특성을 가지고 있으며 Point Light와 마찬가지로 감쇠 효과가 적용됩니다.


Directional Light

- 방향(Vector)만을 가지고 있는 라이트. 시작점과 끝점이 없으며 Position에 영향을 받지 않는다.

 

 

물체가 빛을 받아 밝고 어두워 지는 것은 빛의 방향(Light Direction)과 물체의 방향(Normal Direction)이 결정합니다.

 

 

 

 

 

 

 

이러한 빛을 받음으로 인해 물체에서 일어나는 현상들을 크게 3가지로 분류하면

 

 

  • Diffuse Light
  • Ambient Light
  • Secular Light

로 나눌 수 있는데 이 세가지를 합쳐 연산한 것이 바로 Phong Reflection입니다.

이 세가지만 합쳐져도 꽤나 현실감이 생겼습니다만 이는 현재 거의 쓰이지 않는 구형 라이팅 연산입니다.

하지만 모든 라이팅 연산의 기본같은 느낌이죠.

 

위에서부터 차근차근 알아봅시다.

 

 

 

 

 

 

  • Diffuse Light (직접광에 의한 난반사)

 

Diffuse는 사전적으로 '퍼지다'라는 뜻을 가지고 있습니다.

 

 

의미 그대로 빛의 난반사를 나타내며,

물체에 반사된 빛이 사방으로 흩어져 확산 되면서 그 물체의 표면(질감)과 색상을 인지할 수 있게 해줍니다.

사방으로 흩어지기 때문에 어떤 위치에서 봐도 물체가 같은 색상으로 보이는 것입니다.

 

 

 

 

 

 

 

  • Ambient Light (간접광에 의한 난반사)

 

빛을 받지 못한 부분은 그림자가 생겨 검정색으로 보여야하지 않을까요?

하지만 현실에선 빛이 직접적으로 닿지 않는 부분도 어느정도의 밝기를 가지고 있으며,

화창하고 맑은 날엔 흰색 건물에 드리운 그림자가 '파랗게'보이기도 합니다.

못보셨다고요? 안타깝게도 대한민국에 사시는 군요.

 

 

 

 

Ambient는 사전적 의미로 '주변'이라는 뜻입니다.

모든 물체는 빛을 받으면 그 정도가 다를 뿐 전부 흡수하지 않고 일정량의 빛을 반사하는 성질을 가지고 있습니다.

이렇게 직접적으로 내려 쬐는 빛이 아닌 주변으로부터 반사되어 오는 빛을 Ambient Light라고 부릅니다.

 

맑은 날 파란색으로 그림자가 드리우는 이유는 바로 하늘에 의한 간접광 때문이죠.

 

Unity에선 Ambient를 자동 연산하거나 직접 색상을 줄 수도 있다.

하지만 우리가 이런 Ambient Light를 잘 인지하지 못하는 이유는 '화이트 밸런스(White Balance)' 때문입니다.

하얀 A4용지를 주황색 가로등 아래다가 두었을 때, 실제로는 종이가 주황빛을 내지만

우리는 이것을 하얀색이라 인식하게 되죠...

이처럼 우리 뇌는 주변 환경색에 맞춰 물체의 색을 재해석 하기 때문에 Ambient Light를 잘 알아채지 못하는 것입니다.

Ambient의 존재를 의식하는 순간 세상이 다르게 보일거에요.

 

 

 

 

 

 

  • Secular Light (정반사)

Specular Light는 빛의 정반사로 물체 표면에 반사되는 빛이 정확히 대칭 각도로 반사 될 때 보여집니다.

 

흔히 물체의 가장 밝은 부분(Highlight)으로 표현 되며 Diffuse와 Specular의 비율은 반비례하게 적용됩니다.

Diffuse가 높아지면 Specular가 줄어들고 반대로 Specular가 높아지면 Diffuse가 줄어드는 식.

 

등가교환!

때문에 Diffuse의 비율이 높으면 넓은 영역이 연하게 밝아지고

Specular의 비율이 높으면 좁은 영역이 강하게 밝아지며 주변이 보다 선명하게 비치는데,

흔히 Specular를 하얀 점으로 표현하는 이유가 태양(조명)이 비친 것을 표현한 것이기 때문입니다.

 

이중 거울은 Specular로만 이루어져있어 >>Diffuse가 없습니다.<< 그래서 우리의 모습을 정확하게 확인할 수 있죠.

(물론 각종 불순물이나 먼지 때문에 이상적인 순도 100% Specular는 아닙니다.)

 

정도에 차이만 있을 뿐 Specular가 없는 물체는 없는데요! (Diffuse가 없는 물체는 있지만,,,,,,)

Specular가 없으면 공간감이 상실되어버리며, 윤곽을 알아볼 수 없게 되어버리죠..

우리 주변의 모든 물체들은 각자 자기만의 Specular를 가지고 있습니다.

 

 

 

 

여기서 우리들을 비웃듯이 나타난 것이 바로 반타블랙Vanta Black

 

아무리 검정색이여도 빛을 받은 부분은 받지 않은 부분보다 밝게 보이기 마련인데....

이 자식은 받은 빛을 거의 몽땅 흡수해버려서 물리법칙을 모두 붕괴해버립니다.

윤곽도 확인할 수 없고 공간감마저 상실해버리죠. 마치 사진 위에 포토샵으로 검은 점을 뚝 찍어둔거 같아요. 

검은색 도료의 가시광선 흡수율은 95~98%인 데 비해 ‘반타 블랙’은 99.965% 전부 흡수했다고 봐도 무관합니다.

 

 

이 반타블랙의 원리는 바로 '들어온 빛을 빠져나가지 못하게 가둬버린'것입니다.

VANTA는 ‘Vertically aligned Nano Tube Arrays’의 약자로 나노 튜브를 수직으로 배열했다는 의미입니다.

머리카락 보다 5만분의 1 얇은 탄소 나노 튜브를 수직으로 배치하여 큐브 사이로 빛이 들어오면

빛은 그 사이에서 거듭 반사되며 나노 튜브에 흡수됩니다.

한 번 들어온 빛은 빠져나가지 못하고 나노튜브에 전부 흡수 되어 갇혀버리고 마는 거죠....

 

누가 이런 변태적인 생각을 한 건지....(벤 젠슨이라고 합니다.) 정말 세상엔 다양한 또라ㅇ...천재들이 있는 것 같습니다.

 

그런데 곰곰히 생각해보면 

반타 블랙 역시 빛이 흡수되고 반사되는 성질을 알고 있었기에 만들 수 있는 색상이었던거죠.

변형도 그 본질을 정확히 파악해야 가능하다는 걸 다시 한번 되세기며 다음으로 넘어가 봅시다.

 

 

 

이렇게 예전에는 Diffuse와 Ambient, Specular를 따로따로 조정하여 합치는 방식이었습니다.

(3D MAX의 기본 라이팅 쉐이더가 이 방식이다.)

 

그런데 여전히 구리죠....

사방에서 뿜어져 나오는 Ambient의 컬러는 다양하고, 현실에 있는 물체들의 질감의 종류는 무수히 많고...

거기에 퐁쉐이딩 방식은 하이라이트가 언제나 동그랗게 맺히며 평평한 면에는 Specular를 표현할 수 없습니다.

또 Diffuse와 Specular의 비율은 반비례 해야하는데 이를 마구잡이로 조절해버릴 수가 있죠. (둘 다 높다던가..)

 

이 3가지로 표현할 수 있는건 플라스틱 제질 정도입니다. 그 조차도 뭔가 2%부족한...

 

 

 

 

 

 

 

PBR (Physically Based Renderer) 

 

기술은 끊임 없이 발전합니다.

물리 기반 쉐이더 (Physically Based Shader) 혹은 물리 기반 랜더러 (Physically Based Renderer)로 불리며

물리적으로 보다 사실적이고 정확한 라이팅을 연출할 수 있는 기법입니다.

 

환경에 따라 자동으로 라이팅을 계산해주는 고맙고 든든한 친구가 생긴거죠. 

이전에는 조명이나 환경, 제질이 바뀐다면 그에 따른 Diffuse, Speculer, Ambient를 다시 지정해줘야 했지만

이젠 자동으로 계산해주는 겁니다! 

 

현재 가장 보편적으로 사용하고 있으며 유니티와 언리얼에서 기본적으로 제공하는 쉐이더이기도 하죠.

 

 

 

구형 라이트 방식은 Specular와 Diffuse의 비율을 감각적으로 따로 계산하여 더하는 방식이었기 때문에

그 정확도가 낮았습니다. 이 둘을 따로따로 설정해서 넣다보니 100%를 넘길 수도, 미달할 수도 있으며

Ambient 컬러도 환경에 맞춰 다 계산해서 지정해야했으니까요.

 

 

 

하지만 RBR에선 물체의 고유 색상을 Base Color(Albedo)로 두고,

Duffuse와 Specular의 비율과 제질을 물체의 금속질(Metallic)과 거칠기(Roughness)를 통하여 표현하게 됩니다.

 

그리고 Specular 연산을 없애버리고 Reflection(반사)을 통하여 Specular를 표현하게 되죠.

 

 

 

 

 

 

 

메탈릭 (Metallic)

 

왼쪽- 비금속 / 오른쪽 -금속

 

Metallic은 금속이냐 비금속이냐를 결정하는 수치로

이 수치를 높일 수록 금속질에 가까워지며 내릴 수록 비금속에 가까워집니다.

금속에 가까워질 수록 Specular의 비율이 높아지며 Metallic의 최대값을 부여하면 Diffuse는 0이 되고

Base Color(Albedo)와 Specular만 남게 됩니다.

 

 

 

 

 

금속은 고유의 Specular Color를 가지고 있으며 비금속의 경우엔 하얗게 빛나거나 조명의 색상을 따르는데요,

만약 레거시 랜더러로 파란 박스 안에 있는 금속질 빨간 사과에 주황색 조명을 때린 것을 구현하고 싶다면

 

주황색 조명을 받은 빨간 금속질 사과의 Diffuse와 그 비율...

주황색 조명을 받은 빨간 금속질 사과의 Specular Color와 그 비율...

파란색 상자에 주황색 조명을 쐈을 때 나오는 Ambienr Color............이걸 다 일일히 계산해서 넣어야한다는 거죠...

미쳐버리기 딱 좋아요.

 

하지만 PBR에선 Matallic의 수치를 토대로 Specular와 Albedo를 곱해 자동으로 Specular Color를 뽑아줍니다.

 

 

 

 

 

 

 

 

 

러프니스 (Roughness) / 스무스니스 (Smoothness)

 

 

유니티에서는 매끄러운 정도를 의미하는 Smoothness, 언리얼에서는 거칠기를 의미하는 Roughness를 사용하며

Smoothness는 1에 가까워질 수록 표면이 매끄러워지고, Roughness는 1에 가까워질 수록 거칠어질 뿐

두 기능은 같다고 보시면 됩니다. (그냥 1-하고 이름만 바꾼 것 뿐....)

 

유니티 메뉴얼

 

Smoothness가 0에 가까울 땐 표면이 거칠어짐에 따라 빛이 넓게 산란하며,

1에 가까워질 수록 표면이 매끄러워져 정반사 비율이 높아지며 주변 환경이 보다 선명하게 비치게 됩니다.

 

 

 

 

이전엔 눈에 보이는 그대로 그려 넣는 것이 일반 적이였다면

PBR이 도입 되면서 보이는 그대로 색을 넣어버리면 안되게 되어버렸습니다.

우리가 현실 세계에서 보고 있는 수많은 색들은 그 물체의 고유의 색이 아닌

조명 환경광, 메탈릭, 거칠기 등등이 모두 적용된 결과니까요!

 

아티스트들은 해당 물체가 금속질은 얼마만큼 가지고 있으며, 거칠기는 어떻고, 고유의 색상은 어떤지 알아야했고,

친절한 프로그래머는 이를 시각화 하여 알려주었습니다.  

 

고마워요!

 

 

 

 

BRDF (Bidirectional Reflectance Distribution Function)

 

이뿐만아니라 PBR에서는 재질에 따른 BRDF도 포함합니다.

 

 

BRDF (Bidirectional Reflectance Distribution Function)는 양방향 반사 분포 함수로

어떤 재질이 얼만큼 기울어지면 얼마나 반사가 되는가를 표시합니다.

 

금속과 비금속의 반사율은 다르며 금속은 처음부터 높은 반사율을 가지고 시작하지만 비금속은 일정 기울기까진 본래의 반사율과 비슷하게 유지하다가 일정 각도가 넘어가면 급속도로 반사율이 올라가게 됩니다.

 

 

 

 

이런 멋진 물리기반 쉐이더에 가장 큰 장점이자 치명적인 단점이 있는데 그것이 바로

'물리를 기반으로 하고 있다'입니다.

 

좋다는 거야 안좋다는 거야 뭐야...

 

이게 무슨 말이냐...

조금만 반대로 생각해보면 이는 곧 '물리에 어긋나는 건 표현할 수 없다는 뜻'이 됩니다. 

 

현실에 기반한다고 반드시 예쁜 것은 아닙니다. 자유도가 떨어진 만큼 표현할 수 있는 영역이 줄어든 것 역시 사실이죠.

때문에 처음 PBR이 나왔을 때 그래픽들의 반발이 심했다고 합니다. 지금은 범용적으로 쓰이고 있지만요.

 

 

이에 유니티는 구형 라이트와 신형 라이트 뿐만 아니라 변칙 신형 라이트,

물리기반을 기본으로 하고 있지만 Specular Color와 Diffus Color를 임의로 조절할 수 있는 쉐이더를 제공하고 있습니다.

원리만 알고있다면 기존 신형 라이트와 똑같이 사용할 수도 있고, 변칙도 넣을 수 있는 거죠.

 

 

 

 

즉....커스텀이 가능..........

세상에는 정말 다양한 라이팅 공식들이 존재합니다.

만약 옛 구형 라이팅 공식부터 PBR 라이팅 공식까지 직접 수동으로 짤 수 있게 된다면

내가 원하는데로 비틀어버리는 것도 가능하게 되겠죠.

 

천재 TA를 향해 열심히 공부합시다...

 

 

 

 

 

 

응용하기 

솔직히 Unity에서 기본으로 주는 Standard 쉐이더 하나만 있으면 왠만한 건 다 표현할 수 있습니다. 

근데 텍스쳐를 더 추가한다던가... 약간의 커스텀이 필요한데 그거 못해서 표현 못하면 억울하잖아요.

 

Emission Power는 float으로 변경했다.

 

 

메터리얼에 텍스쳐를 적용하면 다음과 같다.

(각항목에 대한 건.......추후 추가하겠습니다....)