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

(셰이더그래프)아티스트를 위한 URP 셰이더 Shader #13_3 - Custom Light 2

by 대마왕J 2021. 12. 18.

에 이번엔 커스텀 라이트를 조금 더 확장해 봅시다. 

일단 오늘은 두 개를 할건데요, 라이트 칼라를 받아보고 
또 이번엔 외부 파일로 빼는걸 해 봅시다. 

라이트 칼라를 받아봅시다 

우선, 커스텀 라이트 노드의 코드를 다시 봅시다. 

흠.. 

보니까 일단 Light light라고 되어 있네요? Light 구조체를 받아오는 건데 
이 원본 구조체를 찾아보면 아래와 같이 되어 있습니다. 

com.unity.render-pipelines.universal@12.1.1\ShaderLibrary\RealtimeLights.hlsl

// Abstraction over Light shading data.
struct Light
{
    half3   direction;
    half3   color;
    half    distanceAttenuation;
    half    shadowAttenuation;
    uint    layerMask;
};

보니까, direction 말고도 다른 것이 있군요?
저걸 그대로 써주면 되겠습니다. 

칼라 추가는 위와같이 해주면 되겠네요. 
Color를 Output에 추가하고, 
코드에도 칼라를 추가해 주면 
노드에도 Color의 출력이 생깁니다. 

그럼 이렇게 라이트 칼라를 라이트 연산 맨 뒤에 곱해주면, 

라이트 칼라와 밝기의 변화에도 대응할 수 있게 됩니다. 쬬아 하나 해결 

 

그림자를 받아봅시다 

자 이제 위에  있던 Light 구조체를 보면
half    distanceAttenuation;
half    shadowAttenuation;

이라는게 있는걸 보실 수 있는데요, 
distanceAttenuation 은 거리감쇠. 즉 포인트 라이트같은 라이트일때 멀어질수록 어두워지는 감쇠를 말하고 (우린 지금 디렉셔널 라이트를 쓰니까 쓸모없고) 
shadowAttenuation 은 그림자 감쇠, 즉 내가 그림자를 받아서 어두워지는 것을 의미합니다. 

거리감쇠는 일단 됐고 그림자 감쇠를 함 동원해 보죠. 

위처럼 ShadowAtten을 가동시켜 봅니다. 저건 그림자를 받으면 0이 되는 값이므로, 

저걸 저렇게 조명 연산 마지막에 곱해주면 그림자를 받을 수 있게 되는 거죠

...인데 작동 안됩니다  ㅇㄴ미ㅣㅏ서ㅣㅏㅓㅇ니멐ㅋ ㅣㅣㅋㅋ  ㅋ ㅏㅓㅓㅇㄹ ㅋ ㅋ 

아우 이렇게 하면 안돼요 ㅋㅋ
공식 문서에서도 된다고 되어 있는데, 사실 안됩니다. 

이걸 풀어나가려면 일이 커지므로, 일단 안된다에서 마무리 짓고 , 다음으로 넘어갑시다 ㅋㅋ


커스텀 라이팅 연산을 외부 파일로 빼 봅시다. 

 

이제 일이 좀 커집니다. 어... 뭐야 셰이더 그래프가 HLSL과 합쳐지잖아... 라는 느낌인건 아는데.. 뭐 맞습니다.. 맞아요 
사실 이게 간단한 영역에서는 위 처럼 해도 되는데, 일이 점점 커지면 저렇게 간단하게 코드 몇 줄 쓰는걸로 안됩니다. 본격적으로 해야 해요. 

그래서 코드를 제대로 쓰기 위해서, 저 안에 코딩을 쓰는 것 보다 본격적으로 hlsl 파일을 분리하는게 편합니다 

즉 이걸 버려야 할 때가 된거예요. 저기다 쓰는건 한계가 명확합니다. 줄 맞추기도 힘들고, 지금보다 더 길어지면 보기도 힘들어요. 

자 오늘은 외부로 파일을 빼는 것 부터 해 봅시다 

우선 파일을 하나 만들어야 해요. 
텍스트 파일이라도 대충 Asset 아래 폴더 적합한 곳에 만들어 놓고, 확장자를 hlsl로 만듭시다. 
뭔가 되게 이상한거 같지만 이렇게 할 수 밖에 없어요. 유니티에서 hlsl파일을 바로 만드는 방법이 없슈....

저렇게 만들어 놨으면 , 파일을 열고 아래처럼 적읍시다 

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

디렉션과 칼라까지만 받는 코드예요. 기존에 쓰던것과 거의 비슷하지만 함수 형식으로 만들어 써야 한다는게 중요합니다. 그리고 저장합시다. 함수가 뭐다..는 것은 얘기하지 않을께요. 이건 책 본 분들에 한해서의 스터디니까. 

그 다음이 중요합니다. 

- Type을 String에서 File로 바꾸면 파일을 넣을 수 있게 됩니다. 그리고 나오는 Source 에다가 아까 만든 hlsl파일을 넣어줍시다 

- Name 은 hlsl 파일 안에서 CustomLight_float 이란 이름의 함수명이 있으므로, CustomLight 라고 써줍시다. 대소문자 주의.

- Outputs에는 함수에서 일단 Direction 과 Color 가 out 이라고 되어 있으므로 맞춰줍시다. 

이렇게 해 놓으면, 이전과 동일하게 돌아가게 될 것입니다. 

이름 하나, 대소문자 하나 틀리면 바로 에러가 날 것이니 주의해야 해요

일단 똑같이 돌아가게 되었습니다. 

다른점은 커스텀 라이트 코드가 hlsl로 빠졌다는 것 뿐. 

참고하실분들을 위해 아래 첨부시켜 놨습니다 후후 이제 다음 편이 또 있겠네요 

CustomFunction.hlsl
0.00MB
CustomLight2.shadergraph
0.06MB

 

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

 

 
반응형

댓글