셰이더가 한 프레임을 어떻게 그리나
한 줄 요약
MingToon은 한 재질을 여섯 개의 패스로 나눠 그립니다. 표면 모드는 그 패스들이 쓰는 렌더 상태를 한 번에 바꿉니다.
한 프레임에 실제로 나가는 드로우 수와는 다릅니다. 베이크, 기능 토글, 카메라와 광원에 따라 달라집니다. 실제 횟수는 Frame Debugger에서 봅니다.
무슨 일이 일어나나
Built-in 셰이더가 선언하는 패스는 여섯 개입니다.
| 순서 | 패스 | 하는 일 |
|---|---|---|
| 1 | FORWARD_BASE_BACKFACE | 양면 2패스에서 뒷면을 먼저 그립니다 |
| 2 | FORWARD_BASE | 주광, 환경광, 본체 효과 |
| 3 | FORWARD_ADD | 포인트·스폿 같은 추가 광원 |
| 4 | TRANSPARENT_DEPTH_PREPASS | 색 없이 깊이만 먼저 기록 |
| 5 | OUTLINE_HULL_DIRECT | 메시를 확장해 그리는 노멀 아웃라인 |
| 6 | SHADOW_CASTER | 광원 그림자와 Built-in 카메라 깊이 |
URP는 패스 구성이 다릅니다. 같은 순서나 개수를 적용하지 마세요. URP에서는 아웃라인과 깊이 효과가 Renderer Feature로 연결됩니다. 지원 환경을 함께 보세요.
본체
표면 효과는 대부분 2번 패스에서 계산됩니다. 양면 2패스를 켜면 1번 패스가 뒷면을 맡습니다.
일반 투명은 색을 그리는 패스에서 깊이를 쓰지 않습니다. 4번 패스가 색 없이 깊이만 먼저 남겨 두면 아웃라인이 자기 표면을 뚫고 나오지 않습니다. 대신 뒤쪽 반투명 레이어가 가려질 수 있어 모든 정렬 문제를 푸는 스위치는 아닙니다.
그림자와 카메라 깊이
세 가지는 서로 다른 조건입니다. 6번 패스가 살아 있는 것, 이 표면이 카메라 깊이에 들어가는 것, 이 표면이 광원 그림자를 드리우는 것.
패스가 있다는 이유만으로 카메라 깊이에 들어가지는 않습니다. 카메라 깊이 참여는 다른 재질의 뎁스 효과가 이 표면을 가림 대상으로 읽을지를 정합니다.
표면 모드가 실제로 바꾸는 값
| 표면 모드 | RenderType | 큐 | 블렌드 | ZWrite | 깊이 선기록 |
|---|---|---|---|---|---|
| 불투명 | Opaque | 2000 | One / Zero | 켜짐 | 없음 |
| 컷아웃 | TransparentCutout | 2450 | One / Zero | 켜짐 | 없음 |
| 반투명 | Opaque | 2499 | SrcAlpha / OneMinusSrcAlpha | 켜짐 | 없음 |
| 투명 | Transparent | 3000 | SrcAlpha / OneMinusSrcAlpha | 꺼짐 | 있음 |
반투명은 색을 섞으면서도 깊이를 씁니다. 큐 2499는 불투명 범위 안이라 앞에서 뒤로 정렬됩니다. 그 순서에서 가장 가까운 면이 이기려면 깊이가 필요합니다. 양면 머리카락이 안쪽 가닥을 바깥에 덧그리지 않는 이유가 이것입니다.
투명은 뒤에서 앞으로 정렬되고 깊이를 쓰지 않습니다. 불투명한 몸, 비치는 반바지, 치마가 한 재질에 섞인 경우가 이 모드의 자리입니다.
셰이더 키워드
모듈마다 키워드와 프로퍼티가 함께 동작합니다. 키워드가 켜져 있다고 그 효과가 항상 화면에 보이지는 않습니다. 전체 효과 토글, 재질 역할, 강도, 텍스처, 카메라 깊이도 함께 조건입니다.
레이어 티어 키워드
| 모듈 | 추가 티어 |
|---|---|
| 표면 레이어 | _MING_STACK_4, _MING_STACK_10 |
| 노멀 레이어 | _MING_NORMAL_2, _MING_NORMAL_5 |
| 맷캡 레이어 | _MING_MATCAP_2, _MING_MATCAP_5 |
티어는 컴파일되는 슬롯 범위를 정합니다. 실제 레이어 수는 런타임 분기에도 쓰입니다.
그래서 생기는 제약
- 같은 티어 안에서 레이어를 줄여도 컴파일되는 코드 양은 그대로입니다. 티어 경계를 넘어야 줄어듭니다.
- 비활성 패스에서 삼각형을 없애는 경로가 있어도 정점 처리와 드로우 제출이 공짜가 되지는 않습니다.
- 편집용 셰이더는 값을 바꿀 수 있게 코드를 남겨 둡니다. 실제로 줄어든 결과는 베이크한 셰이더에서 확인합니다.
- VRChat fallback은
VRCFallback태그와 호스트 정책을 따르며 MingToon의 효과를 재현하지 않습니다.