본문으로 건너뛰기

셰이더가 한 프레임을 어떻게 그리나

이 페이지는 설명입니다. 표면 모드를 지금 고르려면 기본 설정 가이드를 보세요.

한 줄 요약​

MingToon은 한 재질을 여섯 개의 패스로 나눠 그립니다. 표면 모드는 그 패스들이 쓰는 렌더 상태를 한 번에 바꿉니다.

여기 적힌 개수는 소스에 선언된 수입니다

한 프레임에 실제로 나가는 드로우 수와는 다릅니다. 베이크, 기능 토글, 카메라와 광원에 따라 달라집니다. 실제 횟수는 Frame Debugger에서 봅니다.

무슨 일이 일어나나​

Built-in 셰이더가 선언하는 패스는 여섯 개입니다.

순서패스하는 일
1FORWARD_BASE_BACKFACE양면 2패스에서 뒷면을 먼저 그립니다
2FORWARD_BASE주광, 환경광, 본체 효과
3FORWARD_ADD포인트·스폿 같은 추가 광원
4TRANSPARENT_DEPTH_PREPASS색 없이 깊이만 먼저 기록
5OUTLINE_HULL_DIRECT메시를 확장해 그리는 노멀 아웃라인
6SHADOW_CASTER광원 그림자와 Built-in 카메라 깊이

URP는 패스 구성이 다릅니다. 같은 순서나 개수를 적용하지 마세요. URP에서는 아웃라인과 깊이 효과가 Renderer Feature로 연결됩니다. 지원 환경을 함께 보세요.

본체​

표면 효과는 대부분 2번 패스에서 계산됩니다. 양면 2패스를 켜면 1번 패스가 뒷면을 맡습니다.

일반 투명은 색을 그리는 패스에서 깊이를 쓰지 않습니다. 4번 패스가 색 없이 깊이만 먼저 남겨 두면 아웃라인이 자기 표면을 뚫고 나오지 않습니다. 대신 뒤쪽 반투명 레이어가 가려질 수 있어 모든 정렬 문제를 푸는 스위치는 아닙니다.

그림자와 카메라 깊이​

세 가지는 서로 다른 조건입니다. 6번 패스가 살아 있는 것, 이 표면이 카메라 깊이에 들어가는 것, 이 표면이 광원 그림자를 드리우는 것.

패스가 있다는 이유만으로 카메라 깊이에 들어가지는 않습니다. 카메라 깊이 참여는 다른 재질의 뎁스 효과가 이 표면을 가림 대상으로 읽을지를 정합니다.

표면 모드가 실제로 바꾸는 값​

표면 모드RenderType큐블렌드ZWrite깊이 선기록
불투명Opaque2000One / Zero켜짐없음
컷아웃TransparentCutout2450One / Zero켜짐없음
반투명Opaque2499SrcAlpha / OneMinusSrcAlpha켜짐없음
투명Transparent3000SrcAlpha / OneMinusSrcAlpha꺼짐있음

반투명은 색을 섞으면서도 깊이를 씁니다. 큐 2499는 불투명 범위 안이라 앞에서 뒤로 정렬됩니다. 그 순서에서 가장 가까운 면이 이기려면 깊이가 필요합니다. 양면 머리카락이 안쪽 가닥을 바깥에 덧그리지 않는 이유가 이것입니다.

투명은 뒤에서 앞으로 정렬되고 깊이를 쓰지 않습니다. 불투명한 몸, 비치는 반바지, 치마가 한 재질에 섞인 경우가 이 모드의 자리입니다.

셰이더 키워드​

모듈마다 키워드와 프로퍼티가 함께 동작합니다. 키워드가 켜져 있다고 그 효과가 항상 화면에 보이지는 않습니다. 전체 효과 토글, 재질 역할, 강도, 텍스처, 카메라 깊이도 함께 조건입니다.

레이어 티어 키워드​

모듈추가 티어
표면 레이어_MING_STACK_4, _MING_STACK_10
노멀 레이어_MING_NORMAL_2, _MING_NORMAL_5
맷캡 레이어_MING_MATCAP_2, _MING_MATCAP_5

티어는 컴파일되는 슬롯 범위를 정합니다. 실제 레이어 수는 런타임 분기에도 쓰입니다.

그래서 생기는 제약​

  • 같은 티어 안에서 레이어를 줄여도 컴파일되는 코드 양은 그대로입니다. 티어 경계를 넘어야 줄어듭니다.
  • 비활성 패스에서 삼각형을 없애는 경로가 있어도 정점 처리와 드로우 제출이 공짜가 되지는 않습니다.
  • 편집용 셰이더는 값을 바꿀 수 있게 코드를 남겨 둡니다. 실제로 줄어든 결과는 베이크한 셰이더에서 확인합니다.
  • VRChat fallback은 VRCFallback 태그와 호스트 정책을 따르며 MingToon의 효과를 재현하지 않습니다.

관련 페이지​