언리얼 - Material

Material (7) _ 경사로 VertexNormal 계산

earth-star 2024. 7. 12. 16:55

 
이번에는 꽤나 재미있는 작업을 해 볼 것이다.
 
물체의 표면에서 나오는 벡터를 나타내는 VertexNormal을 내적(Dot)을 하여 경사로의 알파값으로 이용할 것이다.

 
우선 경사로의 돌은 보다 텍스처 크기를 크게 쪼개야하므로 따로 파라미터로 지정한다.

 
위와 같이 강도를 낮추면 보다 큰 돌질감이 나타난다.

 
다음으로 VertexNormal의 내적이다.
 
수학이 조금 들어가서 어려울 수 있는데 내적의 원리만 알면 간단하다.
 

 
 
a 벡터와 b 벡터의 내적은 |a| x |b| x cos θ로 표현이 되는데 코사인의 값에 따라 직각일 경우 0, 평행일 경우 1 이며 그 사이의 경우 0~1 사이의 값이 된다.
 
이를 이용하면 특정한 벡터와 물체의 표면 벡터들을 내적하였을때 값들이 0~1 사이로 분포하고 이를 활용할 수 있다.
 
 

 
위는 언리얼 홈페이지에서 내적(Dot) 함수의 설명을 가져온 것이다.
 
잘 보면 물체의 VertexNormal 값과 사용자가 바라보는 카메라의 내적을 구해서 그 값을 활용한 예시이다.
 
 

 
물체의 외각일수록 카메라의 각도와 수직에 가까워 내적값이 0으로 수렴한다. (코사인 90도 값이 0이므로)
 
이를 1- 함수로 반전시켜 외각일수록 1에 가까이, 중앙일수록 0에 가까이 만들고 Power(제곱)함수로 이 값을 증폭시켜 물체의 Emissive와 Opacity에 연결하여 외각일수록 빛을 발하고 불투명도를 높이고 중앙일수록 빛을 발하지 않고 불투명도를 낮춰 투명하게 한 예시이다.
 
 
 

 
다시 예시로 만든 머티리얼을 보면 예시와 비슷하게 물체의 VertexNormal 값들과 Z방향 위를 향하는 {0, 0, 1} 벡터를 내적시켜 값을 구하고 제곱으로 증폭시킨다.
 
이러면 평면일수록 VertextNormal 벡터가 {0, 0, 1} 벡터와 평행이되어 1에 가까워지고 경사가 심할수록 0에 가까워진다.
 

 
이를 땅에 적용시켜보면 위와 같이 평면일수록 1에 가까워 흰색을, 경사가 심할수록 0에 가까워 검은색을 띈다.

 
우리가 필요한건 반대이므로 1-함수로 반전시키고 Saturate 함수로 0~1값으로 고정한다.

 
반전시키면 위와 같이 나타난다.

 
이것을 토대로 머티리얼 함수를 만든다.

 
이 머티리얼 함수를 바탕으로 블렌드를 해 준다.
 
그럼 두 머티리얼이 만나는 곳은 0~1값을 가지게 되어 보다 자연스럽게 블렌드가 될 것이다.
 
 

SlopeBlend 사용 전
SlpoeBlend 사용 후

 
 
위와 같이 적용전과 비교하였을 때 만나는 부분이 더 자연스럽게 변하는 효과를 볼 수 있다.