본문 바로가기
Shader

ShaderGraph 에서 LightDirection 가져오기

by 대마왕J 2019. 12. 23.

ShaderGraph를 만지다보면,  lightDirecion 노드가 없다는걸 당황하게 됩니다. 

Shader 를 조금 배우다 보면 바로 나오는 NdotL을 구현할 수 없다는데 당황하게 되는데요, 


뭐.. 요샌 그게 추세이니까 -_- ; 


그래서 .. 그냥은 못 쓰고 강제로 꺼내와야 쓸 수 있게 해 놓았습니다. (네가 왜 라이트를 건드리고 그래? 라는 느낌) 



사실 여기 있는

https://blogs.unity3d.com/kr/2019/07/31/custom-lighting-in-shader-graph-expanding-your-graphs-in-2019/

내용인데요, 조금 쉽게 설명해 보겠습니다. 저도 공부할겸. 



일단 언릿 그래프를 하나 만듭시다. 


라이트 벡터를 받아와 보죠 



유틸리티에 있는 커스텀 펑션을 하나 만듭시다. 



커스텀 펑션 노드는 이케 생겼습니다. 

경고문같은거 하나 떠 있죠. 초소한 하나의 아웃풋이라도 있어야 한다고. 


이거 직접 hlsl 코드를 작성하는 노드입니다. 뭔가 좀 고급 기술을 쓰려면 다 있어야 하죠. 결국 코딩이다 으하하 


그리고 톱니바퀴 아이콘을 눌러서 아래와 같이 셋팅합시다. 



인풋은 필요 없습니다. 뭔가 값을 입력받을게 아니거든요. 있는 라이트 값을 받아올거기 때문에 아웃풋만 셋팅하면 됩니다. 

일단 두 개를 셋팅하죠. 라이트의 방향과 라이트의 색상입니다.

둘 다 float3(vector3) 로 셋팅해 놓으면 되겠지요. 라이트 방향은 3차원 벡터이고 색상도 RGB 니까요. 


그리고 그 아래에 Type 에서는 파일과 스트링을 선택할 수 있는데, 파일로 하면 외부 코드를 부를 수 있게 되는거고 

스트링으로 하면 직접 입력할 수 있게 만들어 줍니다. 

그다지 길지 않을 때에는 스트링으로 해버리는게 좋을듯. 


그래서 스트링으로 해 줍니다. 




그 다음에는 에러가 난 것 같은 저 꼴보기 싫은 마젠타색 체크박스를 일단 안보이게 해 보겠습니다. 


아래와 같이 해 줍니다. 초기화 해주는 거죠. 




- Name 에다가 반드시 이름을 써 주세요. 안그러면 에러가 납니다. 함수를 만들어야 하는데 이름이 없는 거거든요 

- 그 후에 Direction과 Color 변수에 적절한 값을 넣어 줍니다. 변수 선언할 필요는 없습니다. 아웃풋에서 만든 것 만으로 선언은 충분! 



적절한 값을 넣어주고 이름을 맞춰 주면 일단 보라보라의 저주는 풀리게 됩니다. 




게다가 저걸 연결해서 출력하면 출력도 잘 된다규 !!!! 



좋아요 조금 자신을 찾았으니까 이번엔 다른걸 해 봅시다 

지금은 그냥 임의의 값을 넣은것 뿐이니까요 ,제대로 된 값을 넣어야죠



그럼 이번엔 아래처럼 작성해 봅시다 


#if SHADERGRAPH_PREVIEW 구문으로, 프리뷰 상태일때에도 에러가 나지 않도록 처리해 줍니다. 

그 후에 GetMainLight() 함수로 [각주:1] 라이트 정보를 받아오고 이걸 Light 클래스의 light 변수 로 넣어 줍니다 [각주:2]


그리고 거기서 받아와서 Direction 과 Color 에 올바른 값을 넣어 줍시다. 




그렇게 하면 우리가 원하는 라이트벡터와 라이트 칼라를 받아올 수 있고, 우리가 아는 Lambert 계산을 할 수 있게 됩니다. 





  1. 이름 틀리면 안됨 [본문으로]
  2. #if 구문을 지우면 Light가 정의되어 있지 않다는 에러나 나는데 웃기게도 정상작동한다 [본문으로]
반응형

댓글