템플릿 버퍼에 숨겨진 객체의 컨투어 그리기

5795 단어 Unityshadertech
학습 템플릿 버퍼 구역에서 벽에 숨겨진 대상의 윤곽 표현을 시도해 봤습니다!

이번에 이루고 싶은 건,
  • 장애물로 인해 숨겨진 캐릭터의 윤곽
  • 표시
  • 비장애물 대상에서 캐릭터가 숨겨진 상태에서 윤곽이 보이지 않음
  • 네.
    이번 캐릭터 대상은 주황색 Sphere, 장애물용 대상은 파란색 큐브, 비장애물인 다른 대상은 흰색 큐브를 사용해 이뤄진다.
    컨투어 부분은 메쉬 패턴으로 그려집니다.
    템플릿 버퍼 메모리의 윤곽 표현을 이용한 조사가 몇 개 나왔지만 장애물 앞에 캐릭터가 있어도 윤곽을 보여줄 수 있는 실크로 바뀌었다.
    이 점을 해결하고 상술한 조건을 실현하는 것을 목표로 실시하였다.
    결국 면도기 두 개만 쓰고 이뤄져서 지식을 남겼다.

    템플릿 버퍼 정보


    화면에 색을 표시할지 여부를 결정하는 마스크 역할을 한다.
    템플릿 버퍼의 값에 따라 그려진 무늬를 수정할 수 있습니다.
    템플릿 버퍼에 대한 자세한 내용은 조사하면 나오기 때문에 여기에 쓰지 않습니다.

    장애물용 면도기


    장애물용 음영기에서 위치를 묘사하는 템플릿 버퍼를 1로 채웁니다.
    템플릿 버퍼의 동작 사용 Stencil 속성.
    이번에는 표의 문법만 사용합니다.
    구문
    의향Ref참조 값Comp사용할 비교 함수Pass비교 함수
    추가 세부내용 참조Unity 브로셔.
    Stencil
    {
    	Ref 1
    	Comp Always    // 描画されるところ全て
    	Pass Replace   // 1(参照値)をステンシルバッファに書き込む
    }
    

    캐릭터용 면도기


    여기서 설명하는 역할은 템플릿 버퍼에 의해 마스크 처리되는 객체입니다.
    캐릭터용 면도기에 네모난 테두리 3개를 쓴다.
    우선 첫 번째Pass 블록부터 살펴보겠습니다.

    첫 번째 패스 블록


    Pass
    {
        Stencil
        {
            Ref 1
            Comp Equal      // 1と一致するものに対して処理
            Pass IncrSat    // インクリメントする(1 + 1 = 2)
        }
        ColorMask 0     // ステンシルのみ書き込み
        ZTest Always    // 深度に左右されずに書き込む
        ZWrite Off      // デプスバッファに書き込まない
    }
    
    첫 번째 블록Pass에 템플릿 버퍼만 기록합니다.
    템플릿 버퍼에만 쓰기 위해 Pass에서는 컬러 채널에 대한 쓰기를 비활성화하고 ColorMask 0에서는 깊이 버퍼에 대한 쓰기를 비활성화합니다.
    여기ZWrite Off로 설정하면 장애물에 숨겨진 부분을 처리할 수 있다.ZTest Always 참고치와 일치하는 부분만 처리합니다.Comp Equal 부분은 장애물을 그리는 부분입니다.1에 참고 값에 +1의 값을 썼습니다. 즉, Pass IncrSat는 템플릿 버퍼에 기록되었습니다.
    현재 드로잉 이미지는 이렇습니다.
    원래 컬러 채널의 쓰기가 비활성화되어 그려지지 않지만 이해하기 쉽도록 흰색으로 변경됩니다.

    두 번째 1+1=2개


    Pass
    {
        Stencil
        {
            Ref 3
            Comp Always     // ZTest Alwaysではないので隠れている部分は対象外
            Pass Replace    // ステンシルバッファを3に書き換え
        }
    
        // CGPROGRAM
    }
    
    두 번째 블록Pass에 캐릭터가 보이는 부분(숨겨지지 않은 부분)을 그립니다.
    템플릿 버퍼에 동시에 기록합니다.Pass 따라서 모든 캐릭터의 부분은 대상이지만 첫 번째 블록Comp Always과 달리Pass 숨겨진 부분은 그리지 않습니다.
    현재 드로잉 이미지는 이렇습니다.

    세 번째 ZTest Always 모듈


    세 번째 블록Pass은 캐릭터의 숨겨진 부분만 그립니다.
    이른바'캐릭터가 숨긴 부분'은 첫 번째 블록Pass에 템플릿 버퍼에 기록된 부분Pass에 해당한다.
    이때2에 설치하지 않으면 장애물에 숨겨진 부분은 처리의 대상이 되지 않습니다.
    마지막으로 그린 그림은 이렇습니다.

    ZTest Always 정보

    QueueSubShader를 사용하여 렌더링 시기를 지정할 수 있습니다.Tag 라벨은 그 중 하나로 대상의 순서를 지정합니다. 기본값은 Queue입니다.
    각 대기열은 내부에서 정수 인덱스로 표시되며 Background는 1000, Geometry는 2000, 알파테스트는 2450, Transparent는 3000, Overlay는 4000입니다.
    Unity 사용자 안내서에 쓴 바와 같이 내부는 정수로 표시한다.
    템플릿 버퍼를 사용할 때 주의해야 할 것은 캐릭터 대상은 장애물 대상 다음에 그려야 한다는 것이다.
    이 순서가 틀리면 좋지 않다.
    따라서 캐릭터용 면도기는 장애물용 면도기보다 큰 값Geometry을 설정해야 한다.
    Pass
    {
        Stencil
        {
            Ref 2
            Comp Equal  // 2と一致するもの
        }
        ZTest Always    // 深度に関わらず描画
    
        // CGPROGRAM
    }
    

    장애물의 대상이 아닐 때는 어떻게 합니까?


    여기까지
  • 장애물로 인해 숨겨진 캐릭터의 윤곽
  • 표시
    실현,
  • 비장애물 대상에서 캐릭터가 숨겨진 상태에서 윤곽이 보이지 않음
  • 어떻게 이루어질까요?하지만 이것도 이미 이루어졌다.
    비장애물 대상은'무장애물용 면도기'만 있으면 된다.
    간단하네.

    최후


    면도기가 설치된 재료를 함께 붙이면 윤곽이 이루어진다.
    다른 실현 방법도 있지만 쉽게 실현할 수 있는 것이 이번 방법이라고 생각한다.
    더 좋은 방법이 있나...아직도 모르는 게 많으니 앞으로도 계속 조사하겠습니다!

    참고 문헌


    참고 가치가 있습니다, 감사합니다.
    Unity에서 템플릿의 컨투어 표현 사용

    좋은 웹페이지 즐겨찾기