본문 바로가기
Shader

유니티 셰이더 그래프(Unity shadergraph) Custom Light Function 외부에서 받아오기

by 대마왕J 2020. 1. 13.

https://chulin28ho.tistory.com/559?category=822622


와 연결될 얘기고요. 


커스텀 펑션으로 라이트 디렉션을 받아오면 상당히 많은 일을 할 수 있겠죠 


일단 이렇게 NdotL로 커스텀 라이트를 구현할 수 있습니다. 


전통적인 Lambert 구현이고요. 여기에 대해선 뭐 설명 많으니 더 설명 안할께요 





뭐 이건 그렇고.. 


또하나의 커스텀 라이트 구현 방식은, 지금처럼 string으로 내부에 처리하는 방식과


File로 해서 외부에서 불러오는 법이 있습니다 


둘은 동일하지만, 아무래도 파일이 길어지면 외부 파일로 불러오는게 좋겠지요. 


외부 파일은 ... 놀랍게도 .hlsl 파일입니다. 

만드는 방식은 ..? 놀랍게도 없습니다. ㅋㅋㅋㅋㅋㅋ




그래서 걍 아무거나 셰이더 파일이건 C# 파일이건 하나 만들어주고 강제로 확장자를 hlsl로 바꿔주면 됩니다. 허허허허 ㅎ

이게 무슨 일인가 하고 싶겠지만 뭐 이겁니다. 이건데 뭐 어쩌겠음. 



이케 말이죠




그리고 저 코드안에 함수를 구현해 주는 겁니다. 위에 string에서 했던것과 같은 내용을 써주면 됩니다. 똑같은걸 만들어 주는 거니까요. 

함수에 대한 기본 개념이 없으시면 그걸 먼저 공부하고 보시면 됩니다. 


구현은 아래처럼 넣어 주시면 됩니다. 


void CustomLight_float( out float3 Direction , out float3 Color )
{
#if SHADERGRAPH_PREVIEW
Direction = float3(1,1,0);
Color = float3(0,0,1);
#else
Light light = GetMainLight();
Direction = light.direction;
Color = light.color;
#endif
}
void CustomLight_half(out half3 Direction, out half3 Color)
{
#if SHADERGRAPH_PREVIEW
Direction = half3(1, 1, 0);
Color = half3(0, 0, 1);
#else
Light light = GetMainLight();
Direction = light.direction;
Color = light.color;
#endif
}

float 버전과 half 버전은 Precision 에 따라 변환되도록 만든 것입니다. 뭐 별 차이는 없습니다. (있긴 한데 설명하기 귀찮)

그렇게 한 후 아래처럼 연결해주시면 완벽하게 쓸 수 있습니다.

코딩을 할 줄 아는 사람을 위한 노드로군요. 커스텀 펑션.










































































반응형

댓글