본문 바로가기
Shader

URP Shader로 뚫리는 이미지 만들기

by 대마왕J 2020. 5. 9.

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 렌더링 그린 이후로 순서를 '당길 ' 수 있게 됩니다. 

다소 변칙적이지만 다른 이펙트와 충돌이 걱정될때 쓸 수 있는 꼼수겠지요 




그럼 숑숑숑 


반응형

댓글