【Unity】색적 범위외를 어둡게 하는 표현의 구현

4393 단어 Unity
자작 게임에 색적 요소를 도입해 캐릭터의 시야외를 어둡게 하고 싶은, 그럴 때의 구현의 일례를 써 봅니다.


환경



Unity 2020.3.20f1
Universal RP 10.6.0

기법



그림자를 그리는 방법 중 하나인 스텐실 그림자 볼륨을 응용해 봅니다.

스텐실 그림자 볼륨이란, 그림자를 떨어뜨리는 오브젝트를 라이트 방향에서 보았을 때의 윤곽이 되는 정점을 연장해, 그 연장되어 생긴 영역내를 그림자로서 그리는 방법입니다.
스텐실 버퍼를 이용하기 위해서 이 이름이 붙어 있습니다.

이 사이트 에 개념이 알기 쉽게 정리되어 있습니다.

툰 톤의 캐릭터의 얼굴에 떨어지는 머리카락의 그림자를 (라이트에 의해 생기는 그림자라면 모양을 제어하기 어렵기 때문에) 스텐실 섀도우 볼륨의 응용으로 이상적인 형태로 내는, 같은 사용 방법도 합니다.

구현



구현이라고 해도 코드는 거의 쓰지 않고 실현할 수 있습니다.

순수한 스텐실 그림자 볼륨이 아닌 임의의 범위를 그림자로 만들고 싶기 때문에 그 범위를 덮는 메쉬를 먼저 준비합니다.
알기 쉽게 Cube의 메쉬로 봅니다.
Cube 객체의 Layer는 새로 추가한 것으로 변경합니다. 여기에서는 추가 레이어 이름을 Cover로 합니다.


그림자를 그려야 할 큐브의 내부 범위는 앞면과 뒷면의 차이로 구할 수 있습니다.

차이를 그리려면 ForwardRendererData 파일(기본 이름은 UniversalRenderPipelineAsset_Renderer.asset)을 관리자에서 편집합니다.
  • Cover 객체는 일반적으로 그리지 않으므로 Filtering 풀다운의 Cover를 체크 해제합니다.
  • Cover 객체의 뒷면 부분의 스텐실 값을 +1하는 RendererFeature 추가
  • Cover 객체의 표면 부분의 스텐실 값을 -1하는 RendererFeature를 추가합니다.
  • 스텐실 값이 0보다 작은 부분을 그리는 RendererFeature 추가

  • 추가한 각 RendererFeature의 설정은 다음과 같습니다.


    뒷면/표면 지정은 RendererFeature에서 재정의하는 머티리얼 셰이더로 합니다.
    뒷면만을 통과시키는 셰이더 코드는 다음과 같습니다. 표면만 통과시키려면 "Cull Front"을 "Cull Back"으로 다시 쓰면 됩니다.

    CullFront.shader
    Shader "Custom/CullFront"
    {
        SubShader
        {
            Tags { "RenderType" = "Opaque" }
    
            Pass
            {
                ZWrite Off
                Cull Front
                Blend Zero One
            }
        }
    }
    

    세 번째 RendererFeature에서 스텐실이 음수 값 부분을 그려 완성합니다.

    물론 표현은 오버라이드 하는 머티리얼의 셰이더 나름으로 무엇이든.


    메쉬 생성




    동적으로 메쉬 생성하는 경우 Unity의 Mesh 클래스에 삼각형화된 배열로 전달합니다.
    "삼각형 분할 귀 깎기 방법"등으로 조사하면 실장법이 여러 가지 나옵니다


    덧붙여서, 디퍼드 렌더링이라면 월드 좌표를 저장한 GBuffer와 어둡게 하고 싶은 범위를 내보낸 텍스처를 사용해.
    UnivarsalRP는 현재 (ver 10.6.0) 디퍼드 비대응이므로, 한다면 렌더 파이프라인에 손을 추가하는 것이 필요합니다.

    좋은 웹페이지 즐겨찾기