Skip to content

FlatLitToon Ru

Sergey Kawashirov edited this page Mar 17, 2019 · 4 revisions

Kawa's FlatLitToon - набор шейдеров, который исторически происходит от Cubed's FlatLitToon. Родился в процессе попыток исправить ошибки и улучшить функции последнего. По сути, является его расширением.

Условия эксплуатации

Шейдер предназначен для использования на персонажах в VRChat, поэтому лишен универсальности и заточен под строго определенные условия:

  • Поддерживается только DX11 (SM5). Для других платформ шейдер не скомпилируется.
  • Нет поддержки лайтмаппинга. Использование шейдера на объектах с Lightmap static не приведет ни к чему хорошему.
  • Нет полноценной поддержки Static batching. Теоретически, работать может, но есть нюансы.

Состав набора шейдеров

По техническим причинам шейдер разделен сразу двумя способами на несколько частей.

По методу блендинга

Разделен на 3 части, по причине того, что при загрузке в VRChat в материалах с нестандартными шейдерами почему-то не сохраняется Rendering Queue (впрочем, как и любые метаданные, например, теги). Из-за этого в одном шейдере нормально работать может только один вариант блендинга.

  • Opaque - "обычный" режим рендеринга. Используется для отрисовки "твёрдой" геометрии.
  • Cutout - "вырезающий" режим рендеринга. Применяется альфа-тест. Отличается от Cutout в других шейдерах возможностью немного кастомизировать обрезку.
  • Fade - "прозрачный" режим рендеринга. В отличие от первых двух, по-умолчанию шейдеры этой категории вообще не отбрасываю тени (ShadowCaster выключен), т.к. часто это и не нужно. ShadowCaster можно включить изменив тег шейдера ForceNoShadowCasting с True на False. В таком случае в редакторе материалов активируются настройки Cutout, т.к. полупрозрачных теней не бывает и тени, отбрасываемые Fade-шейдером, будут рендериться точно также, как и в Cutout.

По составу Rendering Pipeline

Разделен на 3 части. Т.к. Rendering Pipeline в DX11 может включать разное этапов рендеринга, на каждом можно реализовать разные возможности, по-разному потребляя ресурсы.

  • VF aka Lightweight. Самый простой вариант. Rendering Pipeline состоит из двух необходимых этапов: Vertex и Fragment. Базовый функционал, самый быстрый и не лагающий, в основном влияющий на отображение объекта. Полностью поддерживается dynamic batching, общий instancing, stereo instancing для VR.
  • VGF aka Geometry. Расширенный вариант. Rendering Pipeline состоит из трёх этапов: Vertex, Geometry и Fragment. Доступно всё, что есть в VF + штуки которые работают над геометрией (треугольниками) объекта. Т.к. для работы необходима информация об Object Space Объекта, не поддерживается dynamic batching и общий instancing (с ними Unity конвертит Object Space в World Space и шейдер не получает необходимую информацию), однако работает stereo instancing для VR.
  • VHDGF aka Tessellation+Geometry. Самый тяжелый вариант. Rendering Pipeline состоит из пяти этапов: Vertex, Hull, Domain, Geometry и Fragment. Доступно всё, что есть в VGF + тесселяция. На данный момент возможности тесселяции не сильно развиты. Этот шейдер помогает увеличить кол-во треугольников для геометрических компонентов. По этой причине нет просто VHDF aka Tessellation шейдера - это просто бесполезно. Также как и VGF, не поддерживается dynamic batching и общий instancing. Но в добавок и stereo instancing для VR тоже не работает.

Шейдинг

В наборе шейдеров предусмотрено 3 модели теней:

CubedParadox FLT

Полностью перенесённый код из оригинального CubedParadox FlatLitToon шейдера. Для тех, кого не устраивают остальные предложенные модели. В части затенения работает идентично оригиналу.

Kawashirov FLT Diffuse-based

Каваширов, почему ты пластилин? --Charik.

Оригинальный метод затенения основанный на общем, Диффузном методе освещения. Для достижения Toon-эффекта используется несколько модификаций:

  • Сглаживание угла падения света. Определяется двумя параметрами:
    • Light smoooth - насколько угол падения света сглаживается: от 0.0 (сглаживание отсутствует совсем, освещение полностью соответствует диффузному) до 1.0 (абсолютное сглаживание).
    • Correction - количество переизлучаемого света при полном сглаживании. Т.к. сглаживание не фотореалистично и нарушает баланс поглощения/излучения энергии, то существует этот параметр, который определяет количество переизлучаемого света (т.е. яркость) при полном сглаживании: От 0.0 (вся энергия поглощается, объект абсолютно затенен) до 1.0 (вся энергия переизлучается, объект освещен максимально и равномерно со всех сторон). По общим наблюдениям, реалистичное затенение даёт значение около ~0.4 - не слишком тусклое, но слишком пересвеченное.
  • Разделение теней на уровни и их уплощение. Определяется несколькими параметрами:
    • Flatness - насколько сильно выражен эффект уплощения. От 0.0 (эффект не применяется вовсе) до 1.0 (каждый уровень максимально плоский). При промежуточных значениях эффект применяется не полностью, сохраняется как и диффузность, так и разбивка света на уровни.
    • Smoothness - насколько сильно размыты границы уровней. От 0.0 (границы резкие, острые) до 1.0 (границы размыты настолько, что сам эффект уровней уже не виден). При значениях больше 0.5, тени выглядят очень странно. Рекомендуется использовать значения около ~0.1.
    • Scale - управляет количеством уровней. Число уровней управляется автоматически, путем логарифмирования значений теней, их округления, и экспоненцирования обратно. Таким образом Тени разбиваются чаще в темных местах и реже в светлых. Этот параметр позволяет менять масштаб округления под логарифмом. Слишком большое значение сводит на нет эффект уровней, а слишком низкое делает разбиение настолько редким, что тень становится слишком плоской.
  • "Эффект контурного света. Усиливает яркость в касательных, к направлению обзора, местах, создавая эффект ореола. И визуально смещая источник света в противоположную от камеры сторону. Действует именно на освещаемые конкретным источником света части и не влияет на работу в тени.
    • Rim Effect - задает, насколько этот эффект выражен. От -5.0 до 5.0. Отрицательные значения наоборот затеняют края, это экспериментальная возможность. При 0.0 эффект не применяется вовсе.
    • Power - показатель степени касательной. Позволяет "сжать" ореол к самому краю, либо "размыть" его по всему объекту.
    • Bias - для компенсации пересвета/недосвета из-за слишком больших абсолютных значений первого параметра.

При отключении всех этих эффектов, внешний вид теней от данной модели примерно соответствует виду Legacy Shaders/Diffuse Fast, что в свою очередь соответствует тому, как обычно в VRChat выглядят пользователи Toon-шейдеров, когда их шейдеры отключены из-за Safety System.

Данная модель поддерживает механизм Unity для быстрой отрисовки до 4-ёх неважных точечных источников света (Not Important Point Light).

Указанные эффекты применяются ко всем источникам света, т.е. не только к Realtime, но и к Ambient (Baked) освещению и к неважным источникам света.

Kawashirov FLT Ramp-based

11 из 10 почти как в реале xd --Zpydu Cat.

В этой модели для затенения используется Toon Ramp текстура.

  • Ramp Texture - текстура, отвечающая за преобразование диффузной тени. Для определения уровня и цвета затененности в зависимости от значения касательной выбирается цвет с главной диагонали Ramp текстуры.
  • Power - показатель степени касательной, для смещения проб на диагонали Ramp текстуры. Позволяет усилить или ослабить тени, сместить их.
  • Indirect Tint - цвет затенения непрямого света. Т.к. у непрямого (Indirect aka Ambient) света нет явной позиции, и следовательно нет чёткой касательной, определение чёткой тени по Toon Ramp текстуре невозможно (да и не нужно). Однако текстура может быть цветной и меняет тон тени. Этот параметр позволяет задать тон непрямому свету. Для чёрно-белых Toon Ramp текстур рекомендуется оставить этот параметр белым.

В комплекте с шейдерами идет несколько Toon Ramp текстур, в папке Kawashirov\Additional. Выглядят они примерно так:

текстура по-умолчанию

Также несколько Toon Ramp текстур можно найти в комплекте с XSToon шейдерами. В комплекте с ними также идет генератор Ramp-текстур (Меню Tools > Xiexe > XSToon > Gradient Editor).

Приблуды

Приблуды VF

Distance Fade

Попиксельное растворение объекта в зависимости от расстояния. Основано на Cubed's FlatLitToon Distance Fade, но в отличие от последнего, эта приблуда имеет более определенные и широкие настройки. Имеет два режима работы:

  • Range - опрделяется два расстояния, расстворение происходит между этими двумя расстояниями.
  • Infinity - опрделяется одно расстояние, расстворение происходит между этимрасстоянием и бесконечностью.

Параметры:

  • Axis weights - определяет насколько каждая расстояние по каждый из осей влияет на растворение. Менняя значения можно менять баланс между осями. Например, если выставить Y=0, то вертиклаьная ось (вверх-вниз) не будет влиять вообще. Ось W позволяет изменить направление эффекта. Так, если выставть W=-1, то растворение будет происходить в обратную сторону.
  • Random - как опредеяется вероятность растворения пиксела (какие пиксели растворяются раньше, а какие позже):
    • PerPixel - попиксельным ГПСЧ низкой точности.
    • ScreenPattern - семплингом тайлящегося изображения в пространстве экрана.
      • Fade Pattern - текстура, используемая для ScreenPattern.
  • Near Distance -
  • Far Distance -
  • Power Adjust -
  • Scale Adjust -

FPS Indication

Приблуды VGF

Disintegration / Infinity War Decimation

Poly Color Wave

Приблуды VHDGF

Tessellation