본문 바로가기
Shader

유니티 셰이더 그래프 ( Unity Shadergraph): 카메라가 가까이 왔을때 부드럽게 사라지기

by 대마왕J 2019. 12. 25.

블로그 주인장에게 커피값을 후원할 수 있습니다! 

donaricano-btn

카메라가 근접하면 사라지는 기능, 은근히 쓸데가 많습니다. 꼭 사라지지 않고 뭔가 카메라가 근접하면 색이 변하건 움직이건 하게 할 수도 있고요. 

그렇지만 일단 근접하면 사라지는 기능은 이펙트에서 주로 쓰입니다. 빌보드 플렌이 너무 근접하면 티가 나 버리니까 너무 근접하기 전에 사라지도록 하는 방식이니까요. 응용하면 댑스에서도 쓸 수 있습니다. 

간단한 거지만 쓸데가 많으니 뭐 일단...

 

 

일단 메터리얼과 셰이더 그래프를 하나 만듭니다. 셰이더 그래프를 메터리얼에 드래그해서 적용시키고, 다시 메터리얼은 오브젝트에 적용시킵니다. 뭐 이건 다 아실테니까. 

 

이걸 못하신다면 일단 공부를 조금 하고 오셔야...

 

 

이렇게 적용해 놓은 상태에서 이제 시작합니다. 

 

일단 빈 곳에서 스페이스바를 눌러서, position 노드를 꺼냅니다. 각 픽셀의 월드 위치값을 받아오게요. 

 

 

Space 가 World인지 확인합시다. 카메라와의 거리를 재려면 월드 좌표계에서의 위치여야 하니까요.

 

 

다음으로는 카메라 노드를 꺼냅니다. 별게 다 있군요. 디렉션도 있고. (..카메라 디렉션이면 뷰 디렉션 아냐..?) 

어쨌건 저기도 Position 이 있습니다. 그리고 저거 월드입니다. 

 

두 거리가 준비되었으니, 이제 거리를 연산하면 되겠군요. 

두 점의 거리는 피타고라스의 정리... 를 꺼내오면 되겠지만 됐고 

 

그냥 Distance 노드가 있어요. -_-; 

편리하게 거리를 재 줍니다. 

 

제대로 작동하는지 확인을 하기 위해서 Emission에 연결해 봤습니다. 

모든 셰이더의 디버깅은 Emission에 넣어보기가 짱 ... 

 

 

셰이더 그래프 창의 왼쪽 위의 Save Asset 을 눌러 적용시켜 봅니다. 그리고 카메라를 움직여 오브젝트에 근접해 봅시다 

 

 

오홍 뭔가 가까이 가면 어두워지는 것을 볼 수 있습니다. Albedo를 검은색으로 하면 더 잘보였을듯. 

 

 

그럼 이번엔 이걸 투명하게 하는걸로 연결해 봅시다 

 

 

 

방금의 결과물을 알파로 연결하고, 

서피스 옵션은 Transparent로 바꿔 봅시다 

 

 

 

투명해 지기는 하는 것 같은데... 두 가지 정도의 문제가 있습니다. 

 

1. 멀어지면 색상이 이상해집니다 

2. 사라지다가 중간에 뚝 잘려서 사라집니다. 

 

1번 문제는... 알파에 1 이상의 값이 들어가서 그렇습니다. 거리값이 들어가므로 0~ 1 값만이 아닌 값이 들어가는거죠. 거리가 멀어지면 2도 들어가고 3도 들어가고 .. 가정이 무너지고 사회가 무너지고... 

 

 

 

그러니 그럴땐 

 

 

clamp를 하나 끼워 줘서 0~ 1 값 이상이나 이하로 못 벗어나게 제한해줄 필요가 있습니다 [각주:1]

그렇 하면 1은 해결. 

 

 

2.는 ... 얘기하자면 조금 복잡한데, 0.5였던 AlphaClipThreshold 를 0으로 만들어 주는 것입니다. 

 

 

 

이건 뭐냐면, 0.5 즉 '반만 투명' 인 상태를 '잘라' 버려서 아예 연산에서 날려버리겠다는 뜻입니다. 즉 이게 0.5면, 알파값에 0.5만 들어가 있어도 완전 투명으로 잘라 버립니다. 그래서 점점 투명해지다가 갑자기 잘린 것처럼 날라가는 것입니다. 

알파 테스팅할때 쓰는 옵션인데, 알파 블렌딩때에도 기본적으로 동작을 하면서 최적화를 도모하는 방식입니다. 

 

그래서 어쨌건 이게 0.5 면 갑자기 알파값이 0.5일때 완전히 날려서 뚝 끊어진 것 처럼 보이게 됩니다. 그러므로 이걸 0으로 해줍시다. 

 

 

자 그럼 이제 해결이 되었습니다. 

 

근데 좀 너무 가까워야 사라지는군요. 부담스러우니 좀 거리를 띄워보겠습니다. 저리좀 가요 

 

 

 

원리는 간단합니다. 거리에서 2 정도를 빼줬습니다. 나중에 저건 블랙보드로 빼면 조절도 되겠지요. 

 

그러면 거리가 

 

0,1,2,3,4,5.... 되던걸 0,1,1,1,1 로 clamp로 끊었던 것이... 

 

 

 

 

-2,-1,0,1,2,3.... 식으로 숫자가 줄겠지요 

 

 

그리고 클램프를 만나면 0~1 밖의 값은 잘려 버리니까 음수값은 자연스럽게 0으로 잘리고, 1 이상의 값은 알아서 1로 잘리겠죠 

결론적으로 사라지는 거리가 0~1 미터에서 3~4미터로 증가하였습니다. 

 

 

 

 

 

 

 

자 이제 부담스럽지 않은 거리에서 사라지게 되었습니다. 

 

그리고 이건 전체 노드입니다. 별로 힘들지 않고 어렵지 않게 쓸 수 있는 간단한 공식입니다. 

 

 

 

  1. saturate도 마찬가지 역할을 합니다. clamp는 값을 지정 가능하니까 더 응용이.. [본문으로]
반응형

댓글