본문 바로가기
튜터리얼_스터디

(셰이더그래프)아티스트를 위한 URP 셰이더 Shader #13_4 - Custom Light _ Shadow Attenuation

by 대마왕J 2021. 12. 20.

에.. 일단 지난 번에 만든걸 되짚어 보지요. 

이렇게 커스텀 라이트로 라이트 디렉션과 칼라를 가져와서 연산해서 라이트를 만들었습니다. 

뭐.. 다 좋은데

그림자를 '뿌리는' 건 되는데 그림자를 '받는건' 안된다는게 문제였습니다. 

이렇게 돼요 

에.. 이건 ... 

 

그림자를 뿌리는건 되는걸로 봐서 Shadow Pass 는 잘 돌고 있는데, 그림자를 '받는' 게 안되는 것 보니 
light.shadowAttenuation 에 값이 안 넘어오는거라 알 수 있지요. 
그래서 이게 이전부터 안돼서 많은 분들이 고민했던 흔적이 있었는데요. 

https://forum.unity.com/threads/shadow-and-distance-attenuation-do-not-work-in-urp-unlit-graph.803025/

 

Shadow and distance attenuation do not work in URP Unlit Graph

Hi! I'm using Unity 2019.3.0f3 and URP 7.1.7 I'm trying to follow this tutorial:...

forum.unity.com

답변 같은 것들을 보면 멀티 컴파일 분기를 해라.. 뭐 그런 얘기가.. 있는데.. 

막상 해보면 안되더라고요. 
애초에 그게 되게 세팅이 되어 있는지도 믿음이 안가고. 

뭐 .. 그래서.. 이래저래 많은 자료들도 도움을 받고.. 내부 코드도 뒤지고 해서 .. 돌아가게 만들어 보았습니다. 
이것까지 해야 뭐 된 것 같지...

이건 이제 설명하기는 무리예요. ㅋㅋㅋ 
그래서 그냥 풀코드 공개합니다. 

 

URP Custom Light + Shadow Attenuation 풀코드 

void CustomLight_float( float3 worldoPos, out float3 Direction , out float3 Color, out float ShadowAtten){
    #ifdef SHADERGRAPH_PREVIEW
        Direction = float3(1,1,1);
        Color = float3(1,1,1);
        ShadowAtten = 1.0f;
    #else
    
    //shadow Coord 만들기 
    #if defined(_MAIN_LIGHT_SHADOWS_SCREEN) && !defined(_SURFACE_TYPE_TRANSPARENT)
    half4 clipPos = TransformWorldToHClip(worldPos);
    half4 shadowCoord =  ComputeScreenPos(clipPos);
    #else
    half4 shadowCoord =  TransformWorldToShadowCoord(worldoPos);
    #endif
     
    Light light = GetMainLight();
    Direction = light.direction;
    Color = light.color;

    //메인라이트가 없거나 리시브 셰도우 오프가 되어 있을때 
    #if !defined(_MAIN_LIGHT_SHADOWS) || defined(_RECEIVE_SHADOWS_OFF)
        ShadowAtten = 1.0f;
    #endif

    //ShadowAtten 받아와서 만들기 
    #if SHADOWS_SCREEN
        ShadowAtten = SampleScreenSpaceShadowmap(shadowCoord);
    #else
        ShadowSamplingData shadowSamplingData = GetMainLightShadowSamplingData();
        half shadowStrength = GetMainLightShadowStrength();
        ShadowAtten = SampleShadowmap(shadowCoord, TEXTURE2D_ARGS(_MainLightShadowmapTexture,
        sampler_MainLightShadowmapTexture),
        shadowSamplingData, shadowStrength, false);
    #endif

    #endif
}

이렇게 CustomFunction.hlsl  파일에 써 넣어요. 잘 보시면 저번에 한 것에다가 셰도우 연산만 추가된 것입니다. 
나중에 유니티에서 고쳐주면 이렇게 복잡하게 안해도 될 것 같은데 아직은 .. 이렇게 해야 하네요... 일해라 유니티...

그리고 이것만이 아니라 추가로 해줘야 하는 일이 있습니다. 

커스텀 라이트 노드의 Graph Inspector에 가서, 이걸 맞춰줘야 한다는건데요. 
바로 아래처럼 코드와 이름을 맞춰줘야 한다는 것이 가장 중요합니다. 
위와 아래 그림의 박스 색깔을 잘 보세요 :) 

그리고 나서, 노드를 이렇게 연결해 줍니다. 

새로 생긴 worldPos 입력에는 Position (World) 를 넣구요 

새로 생긴 ShadowAtten은 조명 계산 결과에 곱해줘서 그림자 부분을 어둡게 만들어 놔야 해요. 

이렇게 해서 저장해서 결과를 보면...

안되잖아?!???!?

얌마 된다며

 

뭔가 잘못했나.???

아뇨 잘못하지 않았어요. 멀티 컴파일 코드를 넣어야 해서 그래요. 더럽게 복잡하죠 

어쩔 수 없어요. 완전 새로 만드는 것도 아니고, 내부 코드를 약간 파고 들어가서 그걸 가동시키는 거라서 거기 구조에 맞게 만들어 줘야 하거든요. "내부에 멀티 컴파일로 가동되는 코드가 들어가 있으니, 여기도 멀티 컴파일을 만들어줘야 한다!" 뭐 그런거죠. 

다행히 요즘 버전의 셰이더 그래프는 키워드 만들기가 쉬워져서 이걸 넣을 수 있게 되었어요 옛날은 진짜 

 

Multi Compile 설정 - CASCADE

어찌보면 마지막 설정이네요 

블랙보드를 열고, + 를 눌러 Keyword / Boolean 을 선택해줘요.
그리고 이름을 _MAIN_LIGHT_SHADOWS_CASCADE 으로 바꿔주고 Graph Inspector로 가 보면,
Reference도 _MAIN_LIGHT_SHADOWS_CASCADE 로 자동으로 바뀌어 있음을 알 수 있습니다. 

Definition 은 멀티 컴파일 Multi Compile로 해주시고, Scope는 뭐 상관없지만 local로 두고, 
Default 는 켜서 기본적으로 켜지게 해 둡시다. 
사실 이걸 안 킬 이유가 없어서, Exposed는 꺼도 돼요

이렇게 멀티 컴파일 키워드 설정을 해주면, 

캐스케이드 셰도우를 받아올 수 있게 되면서 그림자가 생깁니다! 

멀리 떨어지면 캐스케이드 그림자와 함께 사라지는 걸 볼 수 있지요!! 

 

Multi Compile 설정 - Soft Shadow

음 뭐 이걸로 거의 되긴 했지만, 사실 아직 좀 그런게 있는데.. 

그림자를 잘 보시면, 바닥에는 소프트 셰도우가 깔려 있는데 오브젝트에는 하드 셰도우가 깔려 있는걸 볼 수 있습니다. 
소프트 셰도우 설정도 해줘야 해요!

그림자의 해상도를 낮춰보면, 좀 더 확실하게 알 수 있습니다. 

자 이것도, 멀티 컴파일로 _SHADOWS_SOFT 를 만들어 주고 켜준 후 저장하면, 

소프트 셰도우가 가동되는 것을 볼 수 있습니다!!! 

자 이렇게 해서 정말로 그림자까지 받는 제대로 된 라이팅 구조를 만들게 되었네요!!

 

다 된겁니까?

아뇨 그럴리가 ㅋㅋㅋㅋ  라이팅이 그렇게 간단한게 아닙니다 ㅋㅋㅋㅋ 하긴 그래서 건드리지 말도록 해 놓은 거겠지만!!! 이건 겨우 시작이예요!! 이걸로 다 된거라고 막 자만하고 까불면 안됩니다. 

당장 Additional Light 도 못 받고, 라이트 레이어나 ..라이트 프로브 같은것도 받으려면 작업이 더 필요해요
아니면 라이트맵이라도 적용되게 하려면 또 일이 크고요 ㅋㅋㅋ 

지금은 달랑 디렉셔널 라이트 하나를 제대로 받는 것 외엔 할 수 있는게 없는거지요. 

하지만 거기까지 더 하자면 너무 힘들테니까, 여기서 일단 마무리 짓도록 하죠 ! 

사실 이것도 초보자라고 하긴 높은 수준이라 ㅋ 셰이더 그래프를 다루실 분들도 여기까지 할 필요는 굳이 없으니까, 필요하시면 이거 받아서 하시면 됩니다. 많이 가지고 노세요 . 
이후에도 이걸 바탕으로 시작할테니까요! 

CustomLight3_ShadawAtten.shadergraph
0.07MB
CustomFunction.hlsl
0.00MB

 

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

 

반응형

댓글