언리얼/쉐이더

벤클라우드 아저씨의 게임 쉐이더 강의 Shader Graph Basics Episode 6, 7 Linear Interpolation , Dot Product Node

cothdico 2023. 4. 9. 13:12

딱히 필요한 기능이 생각날 때까지는 시퀀스용 언리얼 에디터 유틸리티 위젯 제작은 그만할 것 같고, 

지금 하는 바이패드 리깅이  너무 오래걸려 심심하던 차 

 이전에 스터디하며 공부했던 쉐이더 관련 포스팅을 씁니다.

Ben Cloward - YouTube

 

벤클라우드라는 쉐이더의 아주 기본부터 알려주시는 분의 유튜브 강의가 아주 좋습니다. 

lerp 나 dot 등,  블루트린트 제작에도 가끔 쓰이는 ( 시퀀스용 툴 만들 땐  꽤 많이) 개념들도 나와서 같이 공부하기 좋습니다. 

 

Shader Graph Basics Episode 의 Episode 6, 7부터 올리는데,

 1~5는 쉐이더 그래픽 파이프라인과 언리얼에서 텍스쳐를 가져오고 머티리얼을 만드는 기본적인 강의입니다. 

Announcing What's Next! - Shader Graph Basics - Episode 1 - YouTube

 


Shader Graph Basics Episode 6

 Linear Interpolation

기본적으로 0-1의 값을 범위로 가지며, 값의 범위를 초과하는 값을 입력시, clamp 되지않고 초과한 값을 출력함

기본적으로 0-1의 값을 범위로 가지며, 값의 범위를 초과하는 값을 입력 시, clamp 되지 않고 초과한 값을 출력함

선형보간

기본적으로 0-1의 값을 범위로 가지며, 값의 범위를 초과하는 값을 입력시, clamp 되지 않고 초과한 값을 출력함

리니어 인터폴레이션은 두가지 텍스쳐를 선형 보강하는데 쓰이는 노드이다.

A, B 두 가지 텍스쳐(or 컬러 ) 인풋을 받으며, 보간정도는 Alpha로 조절한다.

0-1 값이 기본이며, 0으로 갈수록 A가 출력, 1로 갈수록 B가 출력된다.

0-1 값을 가진 텍스쳐도 사용가능하다.

0-1 값을 벗어난 범위의 값을 넣을 수 도 있다. ( 하지만 검게 나오거나 , 컬러가 비정상적으로 보일 수 있으니, 사용하지 말자 )

 


Shader Graph Basics Episode 7

 DOT

두 벡터를 곱한다 , 두 벡터의 곱=내적,  값의 형식은 스칼라

내적인 것은 알았으니, dot 이 어떻게 쓰이는지 예제를 통해 알아보자.

 

1. 버텍스와 카메라와 거리를 구하여 밝기 정도를 조절하기.

→ 카메라에서 보이는 물체의 부분 중, 거리가 가까운 것은 1, 먼 것은 0 값을 가진

그레이스케일을 표현하고 싶다.

 

  1. 카메라 포지션에서 절대월드 포지션을 빼면, 벡터에서 카메라 쪽으로 뻗은 벡터를 구할 수 있다 정확히는 , 카메라 뒤쪽으로 상이 맺힌다.
  2. 여기에 노멀라이즈 과정을 통하여 벡터의 ‘길이’를 1로 만든다. 이 과정을 통하여 각 버텍스에서 카메라 쪽을 바라보는 벡터방향을 얻는다. ( 벡터는 방향과 크기가 있는 개념인데,  크기를 1로 만듬으로  방향값만 쓰기 위함. )
  3. 위에서 구한 벡터내적을 통해 벡터의 노멀이 얼마나 카메라 쪽으로 얼마나 기울었는가를 0~1의 값으로 구할 수 있다. ( cos0=1 cos90=0 , 버텍스노멀, 빗변(n)이 카메라방향(밑변)과 이루는 각도 (0~90)로 (1~0) 값을 얻는다.
  4. 위에서 구한 (1~0) 값을 base color에 입력하면, 버텍스노멀이 카메라방향과 가까울수록 1, 수직을 이룰수록 0 값을 가진 1D 그레이스케일 ( 내적 y: 스칼라 )을 얻을 수 있다.
  5. 반대개념을 적용한 것이 Fresnel이다. ( cos0=0, cos90=1 )

 

익숙한 lambert 쉐이더도 라이트와 오브젝트 법선벡터  Dot 을 통해 계산함 !


추가내용 :

 

카메라 포지션?

월드좌표에서 카메라가 가지는 포지션 XYZ 값을 나타낸다.

3D 벡터이기 때문에, base color에 해당 노드를 연결하면 RGB로 출력된다.

0,0,0 인 상태에서는 블랙이 출력되고

0,0,1000 인 상태에서는 블루가 출력되는 것을 확인할 수 있다.

( 아래 예시는 위치/ 2500을 하여 0, 0, 0.25 값의 blue 가 출력되는 상태이다.

절대 월드 좌표?

월드에서 각 버텍스가 위치한 좌표값을 나타낸다.

사용 예시로는 3축 프로젝션 매핑 쉐이더를 만들어, 물체 간 자연스럽게 이어지는 텍스쳐를 구현하는 데 사용한다.

노멀라이즈?

총 길이가 1을 가진 벡터이기 때문에 , 벡터의 ‘방향성’만 필요한 계산에 주로 사용한다.

 


2. 내적을 이용하여 RGB 텍스쳐를 그레이스케일 화 하기.

 

A 텍스쳐에 0.2126,0.7152,0.0722 를 내적하면, 해당 RGB 이미지의 휘도 Luminance 를 얻을 수 있다.

휘도란 , 이미지에서 반사되어 눈으로 들어오는 빛의 밝기이며, 이처럼 RGB에서 구한 휘도를 상대휘도(relative luminance)라고 한다.

인간이 ‘밝다’ 고 인식하는데 녹색이 많은 부분을 차지하기 때문에 G값이 높다.

위의 그림에서도, 모든 채널이 1,1,1 인 8의 색상이 가장 밝고, R과 G를 가진 3이 그다음, G만 가진 4가 그다음으로 밝다.

but.. 효율이 좋은지는 모르겠다.


Luminance? 상대 휘도?

휘도는 눈부심의 정도, 대상면에서 반사되는 빛의 양을 나타내며 단위는 ‘cd/㎡’이다.

그 자체가 발광하고 있는 광원뿐만 아니라, 다른 광원으로부터 반사되어 빛나는 2차적인 광원(가로등의 빛을 반사하여 2차 광원으로 작용하는 도로처럼)에 대해서도 밝기를 나타내는 양으로 쓴다. → 조명디자인, 차인호 저

보통 상대 휘도는 LR, LG, LB의 절댓값이 아니라 그 비 LR : LG : LB로 표시된다. 종래는 이것을 명도 계수라 했지만 현재는 상대 휘도라 한다. → 네이버 광용어사전

G값이 높은 이유는 = 녹색 빛은 인간이 인지하는 강도에 가장 많이 기여하고 파란색 빛은 가장 적습니다.

Wikipedia site:ko.isecosmetic.com

상대 휘도 (naver.com)

 

상대 휘도

《원자극》 3색 표색계(예컨대 RGB 표색계)의 3개의 원자극의 상대적인 휘도. 3색 표색계는 3개의 원자극을 등량가법혼색으로 하면 등(等)에너지 스펙트럼에 등색하도록 구성되어 있다. 3개의 원

terms.naver.com


3. 채널 마스크 기능

 

내적은 두 벡터의 각 채널 간 곱의 합이다.

따라서 마스크가 필요한 채널만 1, 나머지는 0으로 두면, 해당 채널의 그레이스케일 맵을 얻을 수 있다.

위에 살펴본 dot을 통한 예제들은 각각 Desaturation, mask라는 쉽고 간단한 노드가 이미 있지만, 내적을 어떻게 활용하는지를 공부한 것으로 의미를 둔다.

 


BenCloward 아저씨의 강의 중에, dot을 잘 활용한 강의가 하나 더 있는데,

그것은 바로 UE4 Materials 101의 섬유 쉐이딩강의.

 

Cloth Shading - UE4 Materials 101 - Episode 10

 

카메라 벡터와 버텍스노멀의 내적시, 카메라 정면으로부터 멀이질수록 falloff 되는 것을 볼 수 있다.

 

1-x 로 falloff 의 방향을 바꾸었고, ( =Fresnel ) 변화의 정도를 Power 노드를 연결해 조절하였다.

 

  • 첫 번째, 카메라와 픽셀노멀의 내적값에 제곱과 곱을 사용하여 실크의 특성 ( 정면을 바라보는 표면의 스페큘러가 강한)을 살렸다.
  • 제곱 = 스페큘러의 전체적인 범위를 조절한다.
  • 곱 = 제곱으로 설정한 범위에서, 스페큘러의 falloff정도를 조절한다 (높을수록 더 적은 falloff)

 

 

 

  • 외각부와 중심부 스페큘러를 조절하는 기능을 add 하여 총 4개의 파라미터를 가진 의류 머티리얼 쉐이더 템플릿을 만들었습니다. 이제 4개의 파라미터를 조절하여 사용하면 됩니다.

기본적인 면 , 니트 소재의 특성을 살려 엣지부분이 더 밝아 보이도록 만든상태. 픽셀노멀대신, 월드스페이스로 바꾼 노멀맵을 사용하여 내적을 하였다.
위의 면소재보다 중심부와 엣지의 스펙큘러를 강하고, 동등하게 준 실크 원단

 

 

면재질과 실크재질 결과물