이전 글
https://gall.dcinside.com/m/game_dev/173623
갑자기 짜게 식어서 유기할 수 있음이거 만들 예정기획해둔 건 전부 장황해서 다 적긴 그렇고일지 올릴때 어떻게 구현하려고 했는지 올릴 예정 (여기도 그렇게 했음)게임은 간단한 UI, 간단한 AI, 간단한 컨트롤로 구성되
gall.dcinside.com
원래는 정보로 작성하려고 했는데
쓸데없는 글을 너무 많이 넣어서 걍 일지로 써버림
에디터에서 텍스쳐를 추가하면 셰이더 컴파일 되는게 너무 빡치길래 곰곰히 생각해봤는데
컴퓨트 셰이더를 써서 그런게 아닐까 유추해봄 (결론만 말하자면 아님)
그래서 URP 셰이더를 개조해서 직접 만들기로 했음
셰이더에서 안쓰는 부분은 과감하게 제거하고 필요한 부분 (Albedo, Metallic, Roughness, Normal, Height, Occlusion)을 구현하기로 함
시발 이게 뭐지?
셰이더를 열어보니 이건 C언어도 아니고 C#도 아니고 뭐가 뭔지 이해가 되질 않아서 3초만에 꺼버림
그래서 얼핏 들었던 "유니티 셰이더 그래프"를 이용해보기로 함
이걸 켰을때만 해도 싱글벙글 "벌써 셰이더 완성했나? ㅋㅋ" 라고 생각
다행히도 킹짱갓유니티는 기본 파이프라인 에셋에 들어있는 기본 셰이더의 "셰이더 그래프"를 미리 제공해줌
비싼 병신엔진 한 몸 희생해서 정상화 시켜주신 리치티엘로 열사님... 그립진 않습니다
보면 아주 간단하고 명료하게 그래프로 정리가 되어있음
이거 보고 이해 못하는 초 저지능은 없다고 생각함
물론 나는 초 저지능이라 이해하지 못했음
본론으로 들어가서 셰이더 그래프를 작성해 보면
Albedo 맵을 일단 입력받고, 거기서 UV와 텍스쳐를 분리해서 다음 노드로 전달함
따로 뺀 UV 값은 이렇게 패럴랙스 적용을 위해서 하이트 맵과 같이 합쳐버림
이걸 이용해서 평면 메시에 실제로 메시가 변형된 것 같은 효과를 줄 수 있게 됨
보면 알겠지만, UseHeight이라고 하는 불리언 값을 가진 노드가 있다.
이건 외부에서 정해주는 값이고, 나같은 경우 스크립트로 처리를 함.
Height 맵이 입력되지 않았다면 False 처리를 하고 그냥 UV를 전달하고, 있다면 True 처리를 해서 페럴렉스 맵핑을 함
어쨌든 그렇게 처리가 된 UV는 5갈래로 나뉘는데,
- 아까 처리하다 만 기본 베이스맵(Albedo)
- 어느 부분이 금속이고 아닌지를 나타내는 금속 값(Metallic)
- 표면이 얼마나 거칠어서 반사를 어느정도 하는지를 나타내는 거칠기(Roughness)
- 하이폴리 법선을 노말 방향을 통해 로우폴리에서 보여주는 노말 맵 (이건 다 알겠지)
- PBR 과정에서 빛과 그림자의 적용을 계산하는 오클루전 맵
베이스맵, 노말맵, 오클루전 맵은
그냥 텍스쳐 노드에 고대~로 전달해서 끝냄. 그게 끝임
여기서 특이한 부분은 바로 Roughness인데
유니티 이 씨발새끼는 실사 기반 렌더링(Metallic/Roughness)를 사용할 수 있게 해놓고
금속 값을 Metallic으로 설정해도
거칠기 값은 비실사 기반 렌더링(Specular/Glossiness)의 Glossiness를 사용한다는 점이 있다.
계산 방법은 당연히 서로 반대값이기 때문에
1 - n을 해버리면 해결되긴 한다.
단지 힙스터마냥 이지랄 해놓은게 너무 아니꼬운거임
그리고 따로 Roughness 텍스쳐를 입력받는 곳이 없다.
Metallic 텍스쳐 또는 Albedo 텍스쳐에 Alpha 값으로 합쳐서 입력받으란다 씨팔 ㅋㅋㅋ
1채널 문제로 따로 파는거였으면 Height/Occlusion도 1개의 색상만 필요해서 1채널만 필요한데 이건 왜 안했대?
나는 정말 이해가 되지 않는다
PBR에 대한 정보를 알고 있다면 내가 얼마나 존나 빡쳤는지를 이해할 수 있을 것이다...
서브스텐스 디자이너나 페인터나 전부 유니티 엔진 방식대로 변환해주는 기능을 가지고 있는데
그냥 좀 통일을 했으면 좋겠다
ISO나 IEEE에서 하나로 통일하라고 강제했으면 좋겠다
어쨌든 거칠기 값 계산을 정상화 시키려면
입력받은 1채널 값을 One Minus 노드를 이용해서 변환해주면 된다.
이름 그대로 1 - n을 리턴해주는 노드이다.
완성
투명 맵, 노말맵, 금속재질, 하이트맵, 오클루전 맵 전부 잘 적용됨을 볼 수 있다.
이 간단한거 하는데 며칠 걸림 다시 만나진 말자
멋지다 ㅎㅎ