PBR 렌더, PBS 쉐이더에 대하여

3Ds max 완전 삭제

Unity 오브젝트간 거리 구하기

벡터

벡터는 좌표와 방향을 나타낸다. 유니티에서는 Vector2,Vector3,Vector4 를 사용한다. Vector4는 쉐이더를 다룰 때 사용하고 평소에는 쓸일이 없다. Vector2는 x와 y 좌표를 나타내고 Vector3는 이것에 z 축을 추가한 것이다. 유니티에서는 왼손 좌표계를 사용하여 z 축의 증가 방향이 앞쪽을 향하게 된다. Vector3 의 forward(앞) 값을 보면 z 축이 1 증가한 값을 나타내는 것을 알 수 있다.

자주쓰는 벡터 값

Static 값들을 편하게 사용하자. 벡터를 생성할 때 new Vector3(0,0,0) 이런식으로 생성한다. 하지만 new 키워드를 사용하지 않고 미리 정의된 값을 사용할 수도 있다.

유니티 벡터 Static 정의 API

new Vector3(1,1,1) 는 Vector3.one 과 같다.

new Vector3(0,0,-1) 는 Vector3.back 과 같다.

new Vector3(0,-1,0) 는 Vector3.down 과 같다.

new Vector3(0,0,1) 는 Vector3.forward 과 같다.

new Vector3(-1,0,0) 는 Vector3.left 과 같다.

new Vector3(1,0,0) 는 Vector3.right 과 같다.

new Vector3(0,1,0) 는 Vector3.up 과 같다.

new Vector3(0,0,0) 는 Vector3.zero 와 같다.

벡터 연산

위의 Static으로 정의된 값 이외의 값이 필요하다면, 연산으로 만들 수 있다. 예를 들어 (0,2.5,0) 이란 값이 필요하다면 Vector3.up * 2.5 하면된다.

만약 (-1,-1,0) 이란 값이 필요하다면 Vector3.left + Vector3.down 을 하면 된다.

하지만 Vector3.left * Vector3.down 즉, 두 벡터를 곱한다고 해서  (0,0,0) 이 나오진 않는다. 벡터끼리 곱셈과 나눗셈을 할 수 없기 때문이다.

Vector Magnitude(크기)

벡터는 그 자체로 특정 좌표를 나타내기도 하지만 방향을 나타내기도 한다. Magnitude는 이런 벡터의 길이(크기)를 반환 해준다. (3 , 2) 벡터의 길이는 피타고라스의 정리로 구할 수 있다. 빗변의 제곱은 가로 제곱과 높이제곱의 합이다. 즉, (3 , 2)의 Magnitude는 루트(3² + 2²)이다. 

두 좌표의 거리 구하기

a좌표와 b좌표간의 거리를 구하려면 먼저 a 에서 b를 빼 c를 구한 후(c = a - b) c의 Magnitude 값을 얻는다. 이 과정을 한방에 해주는 것이 Vector3.Distance(a,b)이다. Distance는 파라미터로 받은 두 좌표를 뺄셈하여 결과 벡터를 얻은 뒤, 이 결과 벡터의 Magnitude 값을 반환한다.

결과적으로 Distance는 Magnitude를 포함하므로 루트 연산을한다. 그런데 루트 연산은 CPU 부담이 된다. 작은 양의 괜찮겠지만 많아질 수록 부담은 크게 늘어난다. RPG 게임을 예로 들어보자, 캐릭터에 적들이 달려온다. 캐릭터는 수많은 적들 중 가장 가까운 상대에게 공격을 가한다고 할 때. 수 많은 적들 중 누가 가장 가까운지를 먼저 계산해야 한다. 캐릭터와 적간의 거리를 구하기 위해 Magnitude를 사용한다고 하면, 그리고 적들이 10마리라고 한다면 매 프래임마다 Magnitude 연산을 20번해야 한다. 적들이 100마리라면 매 프래임마다 200번의 루트 연산을 해야한다.

루트 연산을 하지 않고 거리를 비교하려면

단순히 두 오브젝트 간 거리를 비교하고자 한다면 굳이 Magnitude 를 사용해 루트 연산을 하지 않는 방법이 있다. sqrMagnitude를 사용하는 것이다. sqrMagnitude는 루트 연산을 하지 않은채 값을 반환한다. 루트(3² + 2²) 에서 루트 연산만 제거하여 3² + 2² 값만 반환 한다. 반환한 값이 거리를 의미하지 않지만 방향은 표현할 수 있고 루트만 씌운다면 거리가 된다. 즉 sqrMagnitude 값이 크다는 것은 거리가 멀다는 것이다. 이것으로 거리를 비교할 수있는 것이다.

예를 들어 좌표 d(2 , 5) 과 좌표 e(3 , 4) 둘중 무엇이 좌표 f(0, 0, 0)에 가까운지 비교를 해야 한다면 각각의 거리를 구하여 비교하지말고말고(CPU 부담때문에), 벡터의 각 요소를 제곱하여 더한 값을 비교하는 것이다. d(2, 5)의 sqrMagnitude 값은 2² + 5² 이다. e(3, 4)의 sqrMagnitude 값은 3² + 4² 이다. d는 29 이고 e는 25 이므로 d가 f에 더 가깝다고 할 수있다.

 

 

출처:https://teddy.tistory.com/19

마모셋에서 서브스탠스 텍스처 적용하는 법

"마모셋이란 툴의 특성상 아트를 하나 완성한 이후에는 얼마간은 쓸일이 없다보니 종종 옵션이나 설정법을 까먹기 일수다.
특히 요즘은 서브스텐스를 이용해 텍스쳐링을 하는데 이를 이용할 경우 그냥 맵을 불러오기만 해선 안되고 몇가지 조절을 해줘야한다.  서브스텐스로 만들어진 텍스쳐를 마모셋에 그대로 불러오려면

1. 섭스에서 텍스쳐 익스포트를 항목 맨위에 있는 도큐멘트 채널 + 노멀 + AO 를 선택해 뽑아준다. 이러면 기본적인 PBR텍스쳐 외에 AO도 같이 뽑혀나온다.
2. 대부분은 3dmax를 사용해 모델링을 할텐데 마모셋과 맥스의 좌표계가 조금 다르기때문에 노멀맵이 의도치않게 표현될 수 있다. 
    이를 방지하기 위해 레이어에서 메쉬를 선택해 탄젠트 스페이스를 기본값 마모셋에서 3d 맥스로 바꿔준다. 
3. 섭스에서 뽑은 텍스쳐를 마모셋에 링크시키는법은 다음과 같다.

노멀맵 - 서페이스 노멀맵 란에 그냥 때려주면 된다. 그리고 Flip Y를 체크해 반전시켜줘야한다. 이는 오픈GL 기반툴에서 작업하냐 다이렉트x 기반툴에서 작업하느냐에 따라 달라진다는거같은데 나도 아직 이에대한 깊은지식은 없다. 노멀맵 섬네일이미지가 새하얗게출력될텐데 정상이다.

러프니스 - 마이크로서페이스 글로우 란에 러프니스를 넣는다. 섭스에선 0이 흑백, 1이 흰색이지만 마모셋은 반대로 인식하기때문에 인버트를 체크해준다. 

베이스컬러 - 알베도는 그냥 알베도에 넣어주면된다. 이때 기본컬러가 회색으로 되어있어 어둡게 표현되므로 흰색으로 바꿔주자.

메탈릭 - 리플렉티비티 스펙큘러를 메탈니스로 바꿔준 뒤 메탈릭텍스쳐를 넣어주면된다.

AO - 앰비언트 오클루젼은 역시 그냥 오클루전에다 넣어주면된다.

이미시브 - 역시 이미시브에다가 그냥...

하이트맵 - 일단은 디스플레이먼트에 하이트란에 넣어주면 되는데 보통 섭스에서 표현이 완성된 하이트맵은 노멀맵에 다 표현이 되있으므로 안넣어도 된다. 넣어보면 알겠지만 메쉬가 통째로 부풀어오르기때문에 굳이 넣는다면 매우 적은 수치만을 줘야해서 의미가 있는 수치는 아니다.

이정도면 라이팅을 위한 밑준비는 다 될듯.   마모셋으로 불러오면 섭스뷰포트에 비해 참으로 비쥬얼이 초라하기 그지없는데 단순히 조명이 셋팅되지 않은 것이므로 불안해할 필요는 없다. 나머지 후보정이나 조명연출법은 영상을 참고하자.
마모셋과 비슷한 렌더러인 스케치펩을 쓴다면 서브스텐스 안에 메뉴를 통해 섭스뷰포트의 느낌을 고대로 가져갈 수 있다."

 

출처: https://blog.naver.com/chldydwo123/221201491300

'꿀팁 저장소' 카테고리의 다른 글

Zbrush Shift + F 키 비 활성화 하기  (0) 2020.05.04
Reset XForm 개념  (0) 2020.05.03
PBR 렌더, PBS 쉐이더에 대하여  (0) 2020.04.10
3Ds max 완전 삭제  (0) 2019.12.08
Unity 오브젝트간 거리 구하기  (0) 2019.09.02
◀ PREV 12345 NEXT ▶