본문 바로가기
Shader

LWRP(URP) 에서 굴절(Refraction) 만들기

by 대마왕J 2019. 10. 28.

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

donaricano-btn

LWRP에서의 굴절은 간단한데 좀 피곤합니다 

일단 문서 출처는 여기 

 

https://forum.unity.com/threads/the-scriptable-render-pipeline-how-to-support-grabpass.521473/#post-4024678

 

 

이걸 해주기 위해서 먼저 선행되어야 할 일이 있습니다. 

레거시 파이프라인에서는 _Grabpass 로 사용하던 것인데, 

LWRP에서는 파이프라인 셋팅에서 Opaque Texture 를 켜줘야 합니다. 이게 아무래도 그랩패스 역할을 해주는듯. 

 

 

그리고나서 블랙보드에서 텍스쳐를 하나 받아오게 해주는데, 

레퍼런스를  _CameraOpaqueTexture 로 해줘야 합니다. 

 

 

최근에 추가된 기능인 것 같은데, HDRP처럼 URP에서도 Scene Color노드만 꺼내 쓰면 이렇게 안해도 되게 바뀌었습니다. 

HDRP는 원래 Scene Color 노드만 꺼내 쓰면 되었었고요 

 

 

프로퍼티에 노출될 필요는 없기 때문에 Exposed는 껐습니다. 

 

 

New Shader Graph를 하나 만들고, Master 는 Unlit 으로 해 줍니다. 

 

Surface는 Transparent로 , Blend는 Alpha 로 해 줍니다. 

나중에 Alpha에 1로 그냥 남겨 놓는걸 봐서, 렌더링 Queue를 뒤로 빼기 위해서 해주는 것으로 보입니다. 

 

그리고 아래와 같이 블랙보드의 텍스쳐를 그냥 출력해서 공에다가 씌워주면, 뭔가 뒷면이 출력이 되긴 하는데 공의 UV에 따라서 입혀집니다. 

 

그 말인즉슨, 예전 Grabpass처럼 화면 전체를 캡쳐해 찍는다는 말이니

Quad 에다가 입히면 아래처럼 된다는 말이군요. 

네. 되는군요 

 

 

이럴때 뒤의 화면을 제대로 비추게 하려면 역시 Screen 좌표계가 필요하겠죠 

 

UV로 Screen Position을 가져다가 넣습니다. 

float4 인 스크린 포지션을 UV에 강제로 꽂으니 XY만 인식되어서 꽂아지는게 편리한 듯 보이지만 내용을 아는 입장에서는 착잡하군요 

 

 

 

 

이젠 뭐 간단합니다. 노이즈 패턴 같은거 하나 가지고 구기면 되겠죠 

 

 

내장된 심플 노이즈를 써봤습니다. 옵셋 부분에 적용해서 UV를 구겨봤습니다만 역시 수치가 너무 크네요 

아니 그전에 저 심플 노이즈 ... 체크좀 해봐야겠네요 

 

 

하하하하 뭐야 그냥 쌩 계산 아냐 

뭔가 저장할때 최적화를 위해서 텍스쳐로 베이킹 해준다던가 하는 기능같은건 없네요 

최적화를 하려면 텍스쳐로 빼줘야 겠습니다 

 

어쨌건 저건 너무 세니까 약하게 해주겠습니다 

 

 

 

 

많이 괜찮아 졌군요. 이제 이걸 흐르게 하고 

 

 

 

공의 경우에는 외각 라인이 딱 끊어지는게 보기 싫으므로 프레넬을 이용해서 조절해 주면 

 

 

 

완성입니다 

 

 

이렇게까지 해야 하는 것이었나 싶긴 하지만 하여간 일한 티가 나는 건 좋네요 

 

 

반응형

댓글