그래픽(기타)

유니티 SRP 셰이더 그래프 - 13

에페아 2020. 2. 9. 22:00

1. 2Pass 아웃라인

저번엔 프레넬로 아웃라인을 만들었었는데 이번엔 멀티패스를 사용해서 아웃라인을 만들어봅시다

1 - 멀티패스 사용하기

일단 멀티패스를 사용하는 방법이 SRP 환경에서는 좀 특이하게 되있습니다

셰이더 내부에서 패스를 여러개를 못써요

 

새로 바뀐 방법을 통해 패스를 추가해봅시다

Project 탭에서 + 누른 뒤, Rendering -> Universal Render Pipeline -> Pipeline Asset 을 생성해줍니다

생성을 하시면 생성한 파일 + 같은 이름의 Renderer 파일이 추가로 생성됩니다

안을 보시면

전체적인 렌더링 속성? 같은 걸 설정할 수 있게 되어있고, 맨 위에 Renderer List에 보면 파일 생성했을때 같이 생성된 렌더러 파일이 기본적으로 들어가 있는걸 볼 수 있습니다

그럼 저 렌더러 파일도 한번 들어가보죠

그럼 안에는 또 포스트 프로세스 관련 에셋같은게 들어있고, 레이어마스크, 오버라이드 탭이 있습니다

레이어마스크 부분은

펼치면 이런식으로 되어있는데 그릴 레이어를 선택할 수 있는겁니다

이런식으로 모든 오브젝트에는 레이어가 선택되어있는데 이 레이어 중에서 어떤 레이어를 그릴지를 선택하는 것이죠

지금 위에서 보면 Everything이라고 되있으니 그냥 올려져있는거 다 그리겠네요

 

다음으로 Overrides는 이름에서도 어느정도 짐작이 되지만 추가의 느낌이 듭니다

추가로 그린다는거죠

그럼 뭘 추가로 그리느냐?

여기에 추가시킨 리스트들을 추가로 그리는 겁니다

지금은 비어있으니 아무것도 추가로 그리지 않죠

그럼 여기다가 리스트를 추가해서 캐릭터 레이어를 추가로 그려봅시다

저어 아래 + 버튼을 눌러서 나오는 Render Objects를 클릭하면 이렇게 리스트가 추가됩니다

가운데에 보면 여기에도 레이어 마스크가 보이죠? 저길 캐릭터로 바꿔봅시다

대충 설정이 끝났으니 제대로 돌아가는지 한번 확인해봅시다

만든 파이프라인 에셋을 프로젝트에 적용시키는거죠

 

Edit->Project Setting->Graphics에 들어가면 제일 상단에 파이프라인 에셋을 넣는 부분이 있습니다

저걸 우리가 만든 파이프라인 에셋으로 바꿔줍시다

그리고 Quality 부분에서도 파이프라인 에셋을 선택하는 부분이 있는데 거기서도 바꿔줍시다

잘 돌아가는지 확인하기 위해 방금 설정했던 렌더러 파일에서 캐릭터 레이어를 꺼봅시다

잘 먹는 걸 볼 수 있습니다

확인을 했으면 다음 단계를 위해 디폴트 레이어마스크와 오버라이드쪽에 있는 레이어마스크 모두 캐릭터 레이어를 다시 체크시켜줍시다

2 - 아웃라인 셰이더 만들기

이런식으로 원래 있던 버텍스를 노말 방향으로 키우면

기존 오브젝트보다 더 크게 그려지겠죠

그걸 검은색으로 칠한 후에

노말을 뒤집어서 앞면은 안보이고 뒤쪽면이 보이게 하면 이런식으로 나올겁니다

이걸 한번 셰이더로 구현해보는거죠

크기 키우는 부분을 먼저 구현해줍니다

버텍스 포지션에다가 가 버텍스의 노말벡터*외곽선 두께를 더한 값을 버텍스 포지션에 넣어주는거죠

 

그다음 이제 노말을 뒤집어서 뒷면이 보여지게 해야되는데

이때 IsFrontFace라는 노드를 사용합니다

내가 바라보고 있는 방향 기준으로 노말이 나를 향해있는지 뒤쪽을 향해있는지를 bool값으로 반환해주죠

그걸 가지고 나를 향해있으면 0을 반환시키고, 뒤쪽을 향해있을땐 1을 반환시켜서 알파값에 넣어주면 노말이 뒤집힌 것과 같은 효과를 줄 수 있습니다

이런식으로요

판단은 branch를 통해 참 거짓에 따라 0, 1을 출력하도록 합니다

그럼 셰이더는 완성이 끝났습니다

 

근데 그냥 이렇게 둬서 끝나는건 아니고 아까 만든 렌더러 파일에 가서 머테리얼을 넣어줘야합니다

이 셰이더를 먹인 머테리얼로요

이런식으로 방금 만든 셰이더를 넣은 머테리얼을 렌더러에 추가해놨던 패스에 넣어줍니다

그리고 결과를 보면

이런식으로 기본 모델 결과물 + 아웃라인을 위해 만들어놓은 머테리얼이 적용된 결과물, 총 2번 그려져서 아웃라인이 그려진 것을 볼 수 있습니다

 

2. 리플렉션 만들기

하늘을 반사한 게 맺히는 셰이더를 만들어봅시다

 

기존의 스카이박스 말고 다른 텍스쳐를 불러와서 만들어봅시다

스카이박스로 쓸 텍스쳐를 불러와서 Texture Shape를 Cube로 설정해줍시다

이래야 우리의 의도대로 사용할 수 있으니까요

 

그 다음 이걸 셰이더그래프안으로 드래그를 시키면

Sample Cubemap이라는 새로운 샘플러가 등장합니다

이전에 우리가 썼던 샘플러는 Sample Texture 2D, 2d 텍스쳐를 위한 샘플러였고

이번에는 큐브맵을 사용할거니까 Sample Cubemap을 사용하는겁니다

 

입력값은 Cube 텍스쳐, 뷰벡터, 노말벡터, LOD가 있네요

이 값(반사)에 들어가는 연산은 빛과 상관이 없이 내가 바라보는 방향과 물체의 노말방향에만 영향이 가죠

따라서 빛과는 상관이 없으니까 Albedo가 아니라 Emission에 넣어줍니다

참고로 Albedo와 Emission은 덧셈연산을 하기 때문에 albedo에 색이 들어가면 hdr이 될 수가 있습니다

그래서 반사만 보기 위해 albedo에 0(검은색)을 넣어줍니다

 

그럼 잘 먹는 걸 볼 수 있습니다

 

여기다가 노말맵을 먹게 하고 싶다면 이전에 계속 했던대로

노말맵 불러와서->transform으로 오브젝트 스페이스로 바꾼 후 -> 바꾼 결과물을 Sample Cubemap의 노말부분에 연결시켜줍니다

반응형