главная / блог / графика
Опубликовано: 24 января 2026 г. 9 мин чтения графика
Стилизованное освещение: дальше cel shading

Стилизованное освещение: дальше cel shading

Ступенчатые тени — первый шаг, который знают все. Настоящий характер живёт в контровом свете и в том, как выбран цвет тени.

Ступеней недостаточно

При словах «toon shader» первым делом вспоминают округление интенсивности света до нескольких ступеней. Само по себе это даёт дешёвый вид: сцена выглядит не как мультфильм, а как низкое качество.

Разницу создаёт то, в какие цвета попадают эти ступени. Сдвиньте тень не к чёрному, а к дополнительному цвету света — и сцена внезапно начинает выглядеть срежиссированной.

Контровой свет спасает силуэт

В стилизованных сценах объекты склонны теряться на фоне, потому что деталей затенения мало. Поэтому rim light — не украшение, а функциональный инструмент.

Если масштабировать силу rim по расстоянию до камеры, дальние объекты перестают пересвечиваться. Небольшой множитель даёт большую разницу.

Измеряйте стоимость

Предположение, что стилизованные шейдеры дешёвые, ошибочно. Многослойный rim, обводки и собственный расчёт теней могут выйти дороже PBR.

Я замеряю каждый вариант шейдера в RenderDoc и записываю стоимость на GPU в документацию. Когда арт-команда видит бюджет, решения становятся лучше.

ToonLit.hlsl
half3 ToonShade(half3 albedo, half3 N, half3 L, half3 lightColor) { half ndl = dot(N, L) * 0.5h + 0.5h; half band = floor(ndl * _Steps) / _Steps; half rim = pow(1.0h - saturate(dot(N, _ViewDir)), _RimPower); return albedo * lightColor * band + _RimColor * rim; }
hlslToonLit.hlsl

Согласованность решает всё

Все материалы сцены должны использовать одну модель освещения. Один-единственный PBR-объект ломает цельность стилизованной сцены.

Поэтому я пишу общую функцию освещения, которую вызывают все шейдеры. Модель меняется один раз — и вся сцена меняется вместе с ней.

← Все статьи