4.5
비를 만들 땐 유니티에서 기본 제공되는 이미지를 사용했다. 그래도 별 탈은 없지만 동그라미는 여기저기 많이 쓰니까 수학 계산으로 기본형을 만들어두는 게 편하다. 챗GPT에게 물어보니 length를 사용하면 된단다.

half4 frag (Varyings IN) : SV_Target
{
float2 center = float2(0.5, 0.5);
float circle = pow(saturate(1-length(IN.uv - center)-0.5)*2, 2.2);
return circle * _Color;
}
길이를 구한 후 그걸 토대로 필요한 계산들을 거쳐준다. 2.2제곱은 감마 스페이스를 인간의 눈에 예쁘게 보이도록 바꿔주는 것이다. 필요한 계산들은 그 전에 하는 편이 정확하다.

셰이더가 많아졌으므로 이펙트용 폴더를 분리한다. 이전에 망한 프로젝트의 경험을 떠올리면 툰렌더의 이펙트는 의외로 Additive가 적다. 두가지 이유가 있는데, 하나는 만화적인 표현을 위한 컷아웃을 주로 사용한다는 점, 다른 하나는 툰렌더의 특성상 분위기가 밝기 때문에 애디티브 셰이더가 범용적으로 어울리지 않는다는 점이다. 따라서 Additive는 별도의 식별자를 붙이는 편이 좋겠다.

따라서 이렇게 분리된다.
카메라에 맺히는 물방울을 정리하다가 대마왕님의 블로그에서 무려 1채널로! 돋보기 효과를 내는 포스트를 찾았다.
https://chulin28ho.tistory.com/623
하지만 내용을 보니 단색 이미지를 노말로 변환하는 과정이 들어간다. 그렇다면 내용이 똑같으므로 패스해도 되겠다.

작업하다가 엉망진창인 물방울 노드도

깔끔하게 정리해 주고

머티리얼도 정리해준다.

이제 셰이더 폴더도 복잡해졌다.
카메라에 맺히는 물방울은 렌더피처에서 동적으로 끄고 켤 수 있어야 한다. 다음과 같은 방법으로 접근할 수 있다.
[SerializeField] UniversalRendererData rendererData;
...
ScriptableRendererFeature rendererFeature = rendererData.rendererFeatures[0];
rendererFeature.SetActive(true);
이것은 추후 배경의 데이터를 담을 스크립트에 사용할 것이다. 작동하는 걸 확인했으니 일단은 빼두자.
대강 정리가 끝난 것 같다.
다음 작업은… 원래 세컨더리 애니메이션을 할까 했는데, 셰이더를 만지다 보니 이펙트가 하고 싶어졌다. 공용이펙트인 타격/먼지 이펙트를 제작해 보자.