Найти в Дзене

Как работает расчленёнка в Left 4 Dead 2

Играя в Left 4 Dead вы наверняка наслаждались тем как выстрелив зомби в голову, она взрывалась, как отлетали руки и ноги и прочее. Но как же всё это работает? Давайте разберёмся! Для начала давайте посмотрим что из себя представляет расчленёнка в первой части L4D: Это пускай и выглядело не плохо, но Valve хотела большего и поставила в создании расчленёнки для своей следующей игры цели: Звучит понятно и красиво но есть ряд тех. ограничений: Так же в L4D2 имеется более 24,000 вариаций обычных зомби и добавлять к ним в модель ещё что-то очень долго и будет губить производительность
Самым первым прототипом было: А как работала отбраковка внутри эллипсоида? Плюсы этой системы: Проблемы: Далее Valve решили по поэкспериментировать с проецируемой Текстурой Они попытались использовать проецируемою текстуру и альфа канал должен был убирать пиксели Так Valve пришли к тому что они объединили текстуру и эллипсоид и получилось то что мы видим в L4D2 сейчас Как работает слой крови: Код Вершинного

Играя в Left 4 Dead вы наверняка наслаждались тем как выстрелив зомби в голову, она взрывалась, как отлетали руки и ноги и прочее. Но как же всё это работает? Давайте разберёмся!

Для начала давайте посмотрим что из себя представляет расчленёнка в первой части L4D:

  • Встроена в модель
  • Только 5 вариаций
  • Нужно самому редактировать текстуру
  • Всегда фатально для зомби
-2

Это пускай и выглядело не плохо, но Valve хотела большего и поставила в создании расчленёнки для своей следующей игры цели:

  • Точное расположение ран
  • Раны соответствуют силе оружия
  • Отдельная геометрия раны и текстуры
  • Несколько активных/видимых ран на модель

Звучит понятно и красиво но есть ряд тех. ограничений:

  • Всё должно работать на Xbox 360
  • Не должно требоваться сильных процессоров
  • Никаких дополнительных базовых сеток, кроме геометрии ран

Так же в L4D2 имеется более 24,000 вариаций обычных зомби и добавлять к ним в модель ещё что-то очень долго и будет губить производительность
Самым первым прототипом было:

  • Использование эллипсоидов спейс-позы для отбраковки пикселей
  • Заполнение отверстия с моделью раны
-3

А как работала отбраковка внутри эллипсоида?

  • Вершинный шейдер вычисляет относительное расстояние
  • Это значение интерполируется и вырезается/удаляется тексту
-4

Плюсы этой системы:

  • Никаких дополнительных данных буфера вершин
  • Раны это отдельный draw call с
    собственными текстурами
-5

Проблемы:

  • Жесткий разрез выглядел неестественно
  • Раненые модели выглядели странно потому что им нужен был lip вокруг границы раны
  • Не было крови на одежде и коже у края раны
  • Требуется точная геометрическая подгонка с моделью
-6

Далее Valve решили по поэкспериментировать с проецируемой Текстурой

Они попытались использовать проецируемою текстуру и альфа канал должен был убирать пиксели

-7

Так Valve пришли к тому что они объединили текстуру и эллипсоид и получилось то что мы видим в L4D2 сейчас

-8

Как работает слой крови:

  • Проекция текстуры выровнена с осью эллипса
  • Слой крови умножается на градиент чтобы кровь не разбрызгивалась слишком далеко
-9

Код Вершинного Шейдера:

// Subtract off ellipsoid center
float3 vLocalPosition = ( vPreSkinnedPosition.xyz - vEllipsoidCenter.xyz );

// Apply rotation and ellipsoid scale. Ellipsoid basis is the orthonormal basis
// of the ellipsoid divided by the per-axis ellipsoid size.
float3 vEllipsoidPosition;
vEllipsoidPosition.x = dot( vEllipsoidSide.xyz, vLocalPosition.xyz );
vEllipsoidPosition.y = dot( vEllipsoidUp.xyz, vLocalPosition.xyz );
vEllipsoidPosition.z = dot( vEllipsoidForward.xyz, vLocalPosition.xyz );

// Use the length of the position in ellipsoid space as input to texkill/clip
float fTexkillInput = length( vEllipsoidPosition.xyz );

// We use the xy of the position in ellipsoid space as the texture uv
float2 vTextureCoords = vEllipsoidPosition.xy;

Как то вот так странно и интересно работает расчленёнка в L4D2.

-10