템플릿 버퍼에 숨겨진 객체의 컨투어 그리기
이번에 이루고 싶은 건,
이번 캐릭터 대상은 주황색 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 정보
Queue
SubShader
를 사용하여 렌더링 시기를 지정할 수 있습니다.Tag
라벨은 그 중 하나로 대상의 순서를 지정합니다. 기본값은 Queue
입니다.각 대기열은 내부에서 정수 인덱스로 표시되며 Background는 1000, Geometry는 2000, 알파테스트는 2450, Transparent는 3000, Overlay는 4000입니다.
Unity 사용자 안내서에 쓴 바와 같이 내부는 정수로 표시한다.
템플릿 버퍼를 사용할 때 주의해야 할 것은 캐릭터 대상은 장애물 대상 다음에 그려야 한다는 것이다.
이 순서가 틀리면 좋지 않다.
따라서 캐릭터용 면도기는 장애물용 면도기보다 큰 값
Geometry
을 설정해야 한다.Pass
{
Stencil
{
Ref 2
Comp Equal // 2と一致するもの
}
ZTest Always // 深度に関わらず描画
// CGPROGRAM
}
장애물의 대상이 아닐 때는 어떻게 합니까?
여기까지
실현,
비장애물 대상은'무장애물용 면도기'만 있으면 된다.
간단하네.
최후
면도기가 설치된 재료를 함께 붙이면 윤곽이 이루어진다.
다른 실현 방법도 있지만 쉽게 실현할 수 있는 것이 이번 방법이라고 생각한다.
더 좋은 방법이 있나...아직도 모르는 게 많으니 앞으로도 계속 조사하겠습니다!
참고 문헌
참고 가치가 있습니다, 감사합니다.
Unity에서 템플릿의 컨투어 표현 사용
Reference
이 문제에 관하여(템플릿 버퍼에 숨겨진 객체의 컨투어 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/nanbokku/articles/unity-stencil-silhouette텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)