본문으로 바로가기

Shader Graph Custom Shader function

category Technical Report/Unity Shader 2020. 2. 15. 00:07
반응형


Shader Graph에서 RGBA로 입력 받아서 RGB와 Alpha를 나누어서 출력하려면 위와 같은 노드 구성이 필요하다.


비쥬얼 스크립팅에서 파라메터 노출만 해도 이 뻘짓을 안해도 되는데 이게 꽤나 불편해서 Custom node로 아래와 같이 작성해서 사용할 수 있다.



Custom function에서

Inputs을 TintColor 로 Vector4를 입력받게 하고


Oututs 를 ColorRGB 를 Vector3로 ColorA를 Vector1으로 설정해주고 아래 노드 타입을 String으로 설정하고 name을 ColorSplit으로 해줬다. 그리고 아래와 같이 넣어준다.



#if SHADERGRAPH_PREVIEW

ColorRGB = TintColor.rgb;
ColorA = TintColor.a;

#else

ColorRGB = TintColor.rgb;
ColorA = TintColor.a;

#endif



preview를 해줘야 shader graph에서도 색상 확인이 가능하다. sphere 형태로 하려면 코드가 좀 더 복잡해지니 넘어가고... 이걸 code로 바꾸면 아래와 같다.



void ColorSplit_float(float4 TintColor, out float3 ColorRGB, out float ColorA)
{
#if SHADERGRAPH_PREVIEW

ColorRGB = TintColor.rgb;
ColorA = TintColor.a;

#else

ColorRGB = TintColor.rgb;
ColorA = TintColor.a;

#endif
}



잘보면 필요한 계산은 hlsl로 빼서 코드로 불러다 써도 되고 노드 계산으로 복잡해지는건 sub-graph로 빼버려도 된다. 생각해보면 이거 꽤나 편하지 않나란 생각도 살짝 든다.


다만 opaque일때 alpha output에 ColorA 노드를 연결하면 화면에 안나온다. 첨엔 이거 왜이러나 했는데 코드로 바꿔서 셰이더 작성하면 같은 증상이 생겼던게 생각났다.. surface shader에서나 가능하던 코딩....이란 생각이 슬쩍 들어 나도 편한데 너무 익숙해졌나 싶기도 하고...


다만 unlit shader에서 receive shadow를 구현하려면 shadow pass를 수정해야 하니 shader graph에서는 불가능하다. 이것도 나중에 추가되려나.....

반응형