URP Shader에서 뚫리는 이미지 만들기입니다.
스텐실을 이용합니다.
뭐 그외에도 이용할 꼼수들이 좀 있습니다
네네 이런거 만들거예요 네네네네네네네
뭔가 뚫리죠 허허허허
일단 적당히 만든 지형하고, 적당히 Unlit으로 만든 캡슐이 하나 있습니다.
캡슐은 나중에 안보이게 할거라서, 투명하게 만들어 주겠습니다.
투명하게.. 는 Transparent 외엔 선택지가 별로 없지요
알파도 0.2로 해줘서 정말 투명해지나 함 볼수 있게 해 봤습니다.
그 다음에 해야 할 것은 레이어 분리입니다.
저는 Test 라는 레이어를 만들고,
캡슐은 Test 레이어로 바꾸고,
땅Plane은 그냥 Default 레이어로 놔뒀습니다.
즉 현재 이런 상태.
그 다음에 건드려야 할 것은 ForwardRenderer 입니다.
URP의 파이프라인 셋팅에서 가장 중요한 녀석 중 하나이죠
멀티 패스 렌더링을 하기 위해 꼭 써야 하는 놈이기도 합니다.
일단 이 녀석을 선택하고,
기본 마스크 레이어를 test로 해 줍니다. 다른건 다 꺼버리고.
당연히 캡슐만 덩그러니 남아 있게 됩니다
그 다음에 스텐실을 정해 줍니다. 즉 이 캡슐(test 레이어) 의 스텐실을 정하는 거죠.
아래처럼 했습니다.
사실 Value는 꼭 2가 아니어도 됩니다. 1이어도 되는데 손이 미끄러져서 2 ...
여기서 중요한건 Compare Function (비교 함수) 의 결과값이 'Always' .
즉 '이 test 레이어에 속한 오브젝트들은 , 스텐실 값이 2이고, 계산이고 나발이고 무조건 그린다(Always) '
라는 결과입니다.
그리고 Pass 를 Replace로 하면,
' 통과된(Pass) 픽셀 에는 값을 재 등록한다 (Update)'
라고 해 줍니다. 나머지의 경우 ( 그리는거 실패했을 때나 , Z 에 가려져서 그리지 못할 때 )에는 그냥 Keep.
즉, 맨 처음에는 0으로 가득 차 있던 스텐실 버퍼에,
저 캡슐이 그려진 부분만 2로 스텐실 버퍼가 업데이트 되었다는 뜻입니다.
자 그럼 기본이 되었습니다.
두 번째 패스 추가.
ForwardRenderer의 Render Features에 + 를 눌러서, 두 번째 패스를 추가합시다.
두 번째 패스가 추가되었으면, 이번엔 이벤트를 After Rendering Transparents 로 바꿔줍니다.
왜냐면.. 앞에 그려진 캡슐이... 반투명이라서요.....
반투명은 Transparent 순서에 그려지는데, 이게 상당히 늦은 타이밍이라서요
그 이후에 그려라! 라고 해 줍니다.
그리고 나서 test를 제외한 나머지 것들을 그려주기로 결정합니다. 레이어 마스크로요.
즉 ' 반투명 그리고 난 후에 캡슐 제외한 나머지들을 그려라!' 라는 명령이예요.
그랬더니 ㅋㅋ 엌ㅋㅋ
뭔가 빼꼼하는 디그다처럼 되었어요
사실 캡슐은 땅 앞에 있거든요.
그래도 '반투명보다 늦게 그려진' 땅때문에 땅이 더 위에 그려지고 말았습니다.
다음은 두 번째 패스의 스텐실입니다.
이전에 '캡슐이 있는 부분의 스텐실값은 2' 였던거 기억나시죠?
그래서 값은 역시 2로 하는데 비교함수는 'Not Equal' 로 해 줍니다.
즉 땅도 스텐실 값이 2인데, 이미 그전에 씌여진 버퍼에서 '2가 아닌 부분' 에만 그리라는 뜻입니다.
근데 이전에 캡슐이 2를 가지고 있잖아요?
결과적으로 '캡슐만 피해' 그리게 되는 것입니다.
즉 이렇게 되는 것입니다.
캡슐 뒤에 땅이 보여야 할 거 같은데, 캡슐이 그려지면서 스텐실 2를 썼고,
땅이 그릴때 스텐실 2인 부분은 피하고 그려지니까 이렇게 되는거지요
자 여기서 캡슐의 투명도를 0로 내려준다면? 쫘잔
성공했습니다.
=====================================
PS. 근데 여기서 두 번째 패스를 Transparent이후에 그린데 불만이 있을 수 있습니다.
왜냐면 다른 이펙트 같은것들까지 묻혀질 수 있거든요.
그래서 다소 변칙이지만....
반투명(Transparent) 인 캡슐을 선택하고,
메터리얼에서 강제로 그리는 순서를 Geometry , 2000 번으로 바꿔줍니다.
이러면 결과는 똑같은데 - 반투명인것도 똑같고 - 그리는 순서만 불투명 오브젝트를 그릴때 그리게 되는 것입니다.
반투명인데 불투명 그릴때 그리는 거죠 -
이렇게 하면 두 번째 패스를 그릴때 Opaque 렌더링 그린 이후로 순서를 '당길 ' 수 있게 됩니다.
다소 변칙적이지만 다른 이펙트와 충돌이 걱정될때 쓸 수 있는 꼼수겠지요
그럼 숑숑숑
'Shader ' 카테고리의 다른 글
Legacy Pipeline Depth Texture 레거시 파이프라인 깊이 텍스쳐 (0) | 2020.07.02 |
---|---|
URP에서 Particle Vertex Stream으로 UV 조절하기 (1) | 2020.06.25 |
[Unity Shader Graph] 커스텀 라이팅 간단 구현 - Lambert와 Shadow (0) | 2020.02.26 |
유니티 셰이더 그래프(Unity shadergraph) HDRP 굴절과 파티클 버텍스 스트림 연결하기 (0) | 2020.01.16 |
유니티 셰이더 그래프(Unity shadergraph) HDRP에서 굴절(Refraction) 만들기 (0) | 2020.01.16 |
댓글