Террейн – базовые фичи и проблемы

Прежде всего, даже беглый взгляд на vterrain.org показывает, как страшно далеки их проблемы от народа.

 У народа совсем более другие проблемы. Особенно у того народа, который делает не авиасимы со спутниковой картой, а что-то более другое. 

Итак, в игре должен быть террейн. На нем должен стоять и бегать персонаж, на террейн надобно ставить домики  и деревца, красить его надо по-разному, гнуть, вырезать в террейне дырки под пещеры.

Как поступает грамотный пацан? Грамотный пацан выносит проблемы из своего scope. Поэтому у грамотных пацанов редактирование террейна происходит в CAD-CAM тулах ( которые будут именоваться далее кратко - ”майка” ). Грамотные художники режут геометрию на куски и потом хреначат по ней vertex paint ( не более 4 весов на вертекс, максимум пять текстур ).  У совсем достигших просветления пацанов даже preview нету в майке, потому что дизайнеры и так кабаны.  И LOD тоже нету, ибо и так быстро работает, а сабпиксельные треугольники Edge отбросит. Задача переделывать карту, переразбивать и перекрашивать тоже очевидно не стоит. А если стоит, то дизайнер выполнит ее с закрытыми глазами, на области в 100 квадратных километров игровой карты. Проблемы у грамотных пацанов настолько суровы, что хомячка разрывают на куски…

Рассказывать я буду про другой случай, про случай самописного редактора. Игра, повторюсь, в стиле WoW, состоит из сотни квадратных километров террейна. Для которого пишется собственный редактор. Базовое требование очень простое – берет художник кисточку из палитры инструментов. И красит ей с шагом 0.5 – 1.0 метр террейн какой-то текстурой, или выгибает сетку высот. Над этим  может быть построен более высокоуроневый редакторский функционал, скажем, берет дизайнер, огораживает poly-line область на карте, говорит: “сгенери мне тут гору!” Гордо вздымается фрактальная херня, красится в зависимости от высот, градиента высот и фазы луны разными текстурами.

Над картами работают дизайнеры, параллельно. Карты заливаются внешними аутсорсерами во внешний SVN, происходит их приемка, конвертация скриптами, разные билдеры по ночам карты обрабатывают ( билдер лайтмапов, билдер серверных данных для pathfinding ). Поэтому идея “у нас будет двухгигабайтный блоб для террейна” сразу идет нафиг. Карты режутся маленькими кусочками, по 256×256 метров каждый. Это единица загрузки и единица гранулярности на диске. Редактор грузит сразу маску 4×4 ( ровно 1024 x 1024 метров с шагом 256 метров  ) и там как-то живет.

Исходно единица рендеринга – патч террейна размером 32×32 метра. Дизайнер провел кисточкой – в карту сплаттинга добавился слой террейна. Информация о слоях террейна в точке задается примерно вот такой  структуркой:

[code]

struct TerraInfo { uint8 weghts[4]; uint8 indices[4]; };

[/code]

В каждой точке максимум 4 слоя, слой с меньшей интенсивностью вытесняется при редактировании, веса нормализуются. Тут все просто. Проблема состоит в том, что на куске 32×32 метра совокупное число текстур таким образом не лимитировано. Каков бы ни был предел N ( который кажется нам разумным ), дизайнер умудрится провести кисточкой N + 1 раз с разными текстурами. И превед – черные пятна. Я долго мучался, в голове крутилось: “И тут надо вытеснять слой с меньшим совокупным весом, по всему тайлу 32×32 метра”. Крутилось-крутилось, да я что-то не реализовывал. Потом реализовал и был чуть ли не расцелован угрюмыми обычно дизайнерами карт. Слои вытеснялись красиво, артистично. Никаких ровных полосок по стыкам больших тайлов почему-то не наблюдалось. И внезапно оказалось, что дизайнерам и надо, чтобы удалялись лишние слои. Ибо, находясь в творческом поиске, перерабатывая карту по несколько раз, они рисовали рандомные текстуры. Которые лучше бы исчезали в процессе работы с карты, а не светились мелкими чужеродными пятнами. Это была победа в 10 строк кода – сами понимаете, что и в рендере 4 слоя лучше, чем 24.

Теперь про рендер. Писал я не заморачиваясь, год-полтора назад. Чтобы работало, на коленке. У дизайнеров были очень простые желания, оттуда рождались пины  шейдерной системы.

Пин 0.) Слои террейна. До 4 слоев ( все что больше – накладывается аддитивно ), веса в текстурке ( 32×32, per patch терейна ).

Пин 1.) Морфинг. Тут все просто. Геоморфинг, кольца детализации, юниформный грид. 

Пин 2.) Устранение потяжек на вертикальных склонах. Текстурирование в зависимости от xyz компонент нормали, веса увожу в 0 при угле наклона нормали меньше 45 градусов. В результате те куски террейна, где есть вершина с normal.z < 0.71, рисуются специальным шейдером с тройным чтением текстуры, по .xy, .yz, .zx.

Пин 3.) Мегафича. Два слоя террейна, в пиксельном шейдере есть if( height0 – height1 < 0.0f ){ discard; }. Красивые получаются такие обрывы и острова, ни у кого такого нет. В рендере, на уровне кусков 32×32 метра – опять пин. Забавным образом работает с морфингом и не видно мерцающих пикселей. Почему – сам не знаю.

Был такой замечательный редакторский террейн, предназначенный для быстрой модификации, были у него проблемы. Очень простые:

0.) Общая заточенность на рантайм-изменения. Множественные уступки перфомансу.

1.)  Юниформный грид, излишняя плотность треугольников на плоских кусках.

2.) LOD шейдер, который тянет тяжелый FVF. И меняется очень часто.

3.) Гранулярность куска в 32×32 метра форсирует излишне тяжелые шейдеры. Один маленький бугорок форсирует тройное чтение из текстуры, одно пятнышко текстуры форсирует лишний слой во всем куске.

Самая злая проблема конечно последняя. Попытаться решить ее уменьшением рендер-куска неразумно. DIPs взлетят к небесам. Думал я думал, как победить. И решился. Сидел неделю, усиленно фигачил код, словно мне 20 лет, а не 30. И написал Новый Прекрасный Террейн. Форк для статической релизной ROAM-like версии террейна, которая заботливо строится по ночам билдером.  

Напишу пожалуй на блоге скоро.

  • http://www.cgportfolio.ru/database/showthread.php?t=26 Vlasov Alexey

    > Прежде всего, даже беглый взгляд на vterrain.org показывает, как страшно далеки их проблемы от народа.

    Незнаю-незнаю…
    Вроде все есть. Вот к примеру сходу http://www.quadsoftware.com/index.php?m=section&sec=product&subsec=editor&target=editor_ver12

    Такое даже анрыл тиму не написать еще очень и очень долго…

    Можно попроще и подешевле но тоже нормально:
    http://www.d-grafix.com/?page=ted
    http://www.earthsculptor.com/index.htm
    Или http://filax.celeonet.fr/portal_joomla/index.php?option=com_content&task=view&id=17&Itemid=42&lang=en

    т.е. я к тому что редактировать завсегда проще в сторонем плюс проблемы очень даже близки народу:)

  • kas

    > т.е. я к тому что редактировать завсегда проще в сторонем плюс проблемы очень даже близки народу:)
    а потом неожиданно надо сделать двухсторонний терейн, прям как у пети. и такие привычные и удобные сторонние редакторы ниожиданно всасывают )

  • IronPeter

    Я не верю в сторонние “технологические рещения”. Вообще. Чуть верю в zlib, чуть в FMOD, чуть в DX9. В UE3 не верю. В чудеса в коробке не верю.

    Если пишут >Unlimited layers of textures with various shading settings to add realistic color details. Arbitrary oriented texture mapping that can be used to map textures vertically, horizontally or with any rotation on terrain slopes, то я сразу ожидаю трагическое наебалово. Или не работает, или тормозит, или и то и другое. Вспоминаю UE3, где террейн шел черными пятнами тупо по исчерпанию лимита инструкций ps.

    Понимаешь, слишком много пинов у этой поебени Рахманинова. “Текстура” в техпроцессе – это не отвлеченное понятие. Это вполне себе определенная сущность. Ее коммитят, экспортят, настраивают, на нее создают ссылки. Разные люди это делают. Есть много кода про стримминг текстуры. Есть много рендер-кода про шейдеры. Код не просто так, не для удовольствия, он решает вполне определенные задачи. Он на расстоянии грузит текстуры с меньшими мипами, он на расстоянии делает LOD материалам, он сливает дипы с одинаковыми материалами.

    Интегрировать чужой шмат кода про то же, с чужой идеологией – это выноси всех святых.

    Чудес не бывает. Если художник провел N раз кисточкой и в карте сплаттинга добавилось N слоев – то не надо ждать чуда. Будут проблемы или с числом материалов, или с их сложностью. Я не верю в волшебных гномов, которые решат мои проблемы.

    >Visually create single instances or use the object brush to spawn multiple objects at once. Control spawning area density, size, orientation, altitude and depth.

    Отлично, значит будем использовать их формат карты? Интегрировать его в чекеры, билдеры, техпроцесс.

    Впрочем, я готов беседовать конструктивно. Чисто по спекам ( если готов отвечать конкретно за http://www.quadsoftware.com/ ). Если готов – то я задаю вопросы, ты отвечаешь. Вопросы простые. Формат вертекса, объем данных на диске, в памяти, число вертексов и материалов в кадре, тупые такие спеки. Отвечать готов?

  • IronPeter

    PS. В UE3 я верю даже больше, чем в эту ерунду. Потому что это целиковое решение – достаешь из коробки и хуяришь шутер. А тут непонятная фигня с кучей торчащих проводков.

  • IronPeter

    PS. Тут касег заметил, что я грубовато ответил. Приношу чистосердечные извинения за грубоватую форму ( абсолютно ничего личного ), но содержание остается в силе. Оно было реакцией на то, что такое middleware реально сложно интегрировать. А редакторы террейна прикольные, верю.

  • http://www.cgportfolio.ru/database/showthread.php?t=26 Vlasov Alexey

    > Формат вертекса, объем данных на диске, в памяти, число вертексов и материалов в кадре, тупые такие спеки. Отвечать готов?

    Конечно. Как только посмотрю их SDK так сразу и:) Парни кстати предлагают свои услуги по интеграции терейна в любое двигло. Переложи свои проблемы с больной головы, на голову, которой за это платят деньги:).
    Меседж твой был про то, что “как все плохо” в плане не состыковки реальных задач и существующих мидлевеа. Я указал, что это не так. Мне вполне очевидно, что никто не будет сейчас прямо все переписывать под Гром в Аллодах. И да даже с нуля это не простая задача. Заложить за ранее т.е. бОльшую часть вопроса решить планированием внятным, вот мой поинт скорее т.к. таким образом мы получаем чуть ли не лучший редактор из существующих за разумные деньги с подержкой + перекладываем все вопросы по интеграци на чужие плечи пусть даже и за “дорого”…

    p.s. Я ихний SDK не видел т.к. не являюсь кастомером. По этой причине несмогу предметно(в смысле так конкретно) к сожалению. По редактору сходу могу сказать что черных пятен нет. Очень клевая реализация интерфейса. Все удобно и функционально. Куча механизмов по сшиванию различных тирейнов и изготовлению фотреалистичных ландшафтов для игр.

    p.p.s. > Тут касег заметил, что я грубовато ответил.

    Да все нормально…

    Кстати в прошлой твоей записи с интересом читал про проблемы инстансинга и дрочева в драйвере. Ну с драйвером все понятно (точнее совсем не понятно но тут мало что можно поделать), а вот с инстансингом это опять не твои проблемы. В моем понимании ты сделал все, что мог:) Концептуально поднять производительность с такими условиями наврятли удасться. Т.е. очевидно, что здесь, как мне кажется, вопрос в коммуникациях между отделами (арт и программирование). Почему не были решены вопросы с арт отделом и они нахерачили тясячи “одинаковых” деревьев, но сразным освещением в вертексах – не понятно. Т.е. ясно, что инстансить такое не получится, как не крути и вопрос не лежит в технической плоскости т.к. начальные условия постановки задачи..эээ…очень сложны, если не сказать слегка абсурдны(т.е. в смысле они тебе в таком виде достались. Или так получилось, но дело не в том, что кто то плохой программер.). В моем понимании инстансинг в ММОРГ как и террейн это очень важные вопросы, решение которых требует крепкой работы между отделами. Иначе, “как-то так”…Я это написал к тому, что проблема терейна _частично_ опять(снова) лежит в плоскости “взаимодействия” а не “качества по отдельности”. Как мне кажется…

  • IronPeter

    Начнем с конца.

    Про деревья с кастомным вертекс-лайтом. На самом деле, дизайнеры ставят совсем одинаковые деревья. Освещение считаю я сам. Иначе – некрасиво :). Освещение в ММО – отдельная песня, потому что надо красить реально большие пространство. И быстро стриммить. Проблемы сильно комплексные, потому что плюс к освещению есть per-object лоды. Есть различие в материалах ( на расстоянии в N метров мелочь уходит в полупрозрачность с другим материалом, есть LOD для шейдинга ).

    Проблему можно аккуратно решать. Скажем, если освещение в лайтмапах, то инстансить чуть проще.

    Проблема с инстансингом стоит очень остро на PC. Потому что интерфейсы инстансинга кривые и не имеют отношения к тому, что есть в железе. Да и сама проблема инстансинга высосана из пальца – DIP вызовы _искусственно_ дорогие, не имеют никакого отношения к реальной цене DIP на железе. Мои поинт в прошлом сообщении был о том, что на других платформах ( консолях ) эти проблемы находят совсем другие решения. Да и местами вообще не стоят. Инстансить с разным освещением в вертексах – в полпинка на RSX ( и с SPU, и без оного ).

    Вернемся к террейну.

    > Мне вполне очевидно, что никто не будет сейчас прямо все переписывать под Гром в Аллодах

    Факт. Техпроцесса наросло куча. Не просто куча, а огромная куча. Оно обрело отражение в штатном расписании даже. Затвердело.

    >перекладываем все вопросы по интеграци на чужие плечи пусть даже и за “дорого”…

    Я не верю в волшебных гномов. Я знаю примеры, когда интегрированный миддлварь вставал раком. Самый яркий пример – это наверное http://www.umbra.fi/ . Внезапно оказывается, что охеренный лоадинг тайм ( а пребилдить данные не умеет и бинарного формата нет ). Внезапно оказывается, что не живет на реальных сценах. И официальный ответ от саппорта “а что вы хотели от нашего говна, юзайте occlusion query”. Паффайдинг такой же бывает…

    Про террейн я очень боюсь, что встанет раком. Если нет черных пятен в местах стыков материалов – значит много слоев. И встанет раком, когда начнет освещаться. Потому что проблемы не решаются сами. В террейне есть фундаментальный баланс “число материалов – сложность материалов”. Нарушить баланс элементарно введением любой фичи, любым минорным усложнением шейдинга, любым изменением спека, любой фичой. Чинить – пиздец как тяжело.

    Помню панические письма в UE3 саппорт “йоб вашу мать, мы выходим через 2 месяца, где НАШИ ДЫРКИ В ТЕРРЕЙНЕ!”. И ответ: “ваши дырки в террейне – фичакат. Отъебитесь. Пожалуйста. Спасибо”.

    Мой поинт – если решились на интеграцию такого миддлваря – спекать как чертям. Сделать тестовые сцены. Обсудить сложности интеграции. Грубо говоря, если 2 человеко-года интеграции, то на препродакшн надо потратить 2 человеко-месяца. И не просто – бзднул и готово. А работать как подорванным.

    Собственно, мне интересны технические проблемы. Так что следующий пост будет сугубо технический. Про то, как борол поликаунт, сложность материалов, дипкаунт, объемы памяти. Ежели решились интегрировать чужое – смотрите и замечайте, проблемы имеют характер универсалий. С чужим может быть сложнее.

  • IronPeter

    Я просто так, для смеха, упомяну про всякую минорную обвязку, которая есть вокруг нашего террейна.

    1.) Специальный color surface, где дублируется лайтмап. Трава и динамика берет оттуда освещение.
    2.) Специальные occluder объекты под террейном. Которые формируют линию горизонта и отсекают объекты. Как я йобся, чтобы оно работало на двуслойном террейне – это отдельная песня.
    3.) Трава. Растет, берет цвет и высоту террейна. Тип травы связан с материалом.
    4.) Вода.
    5.) Специальные физические зоны, для воды.
    6.) Информация о физическом материале, для звука шагов.
    7.) Разбивка по зонам, информация о глобальном освещении ( там и цвета и разные SkyDomes ).
    8.) Информация о дырках.
    9.) Серверная информация о паффайндинге.

    Вот такая поебень. Суммарным объемом человеко-годы.

  • Dmitry Tyurev

    А ландшафт, как произвольная сетка, у вас не рассматривался, в качестве альтернативы? Карту высот + слои кисточкой выбрали только из соображения “проще рисовать художникам”?

  • CEMEH

    Уже привычно измеряю хорошесть поста про графику по силе ностальгии. Тут – хорошо вставило, спасибо.
    Напиши такие же посты про остальные интересные части графики, а? Ну там, шейдинк, эффекты, хуе-мое?

  • IronPeter

    >Dmitry Tyurev

    Серьезно не рассматривался, я в принципе не жалею. В начале проекта был некий паттерн WoW-like, потому и не рассматривали.

    >СЕМЕН

    Но я допишу сначала про террейн. Уже ожидаю, как в меня полетят гнилые помидоры “ты чо, чувак, в наш век DX11, терафлоп и marching cubes на проективной сетке – ты ебанулся так писать”.

    У меня очень простой поинт. Чтобы читатели gamedev.ru чуть оторвались от той искаженной реальности, в которую их загнали уайт-пейпры IHV. И чуть почувствовали вкус реального девелопмента.

  • Dmitry Tyurev

    >паттерн WoW-like, потому и не рассматривали.

    Ясно. Просто сам делал рендер ландшафта в паре ММО, отсюда и интерес.

    >Уже ожидаю, как в меня полетят гнилые помидоры “ты чо, чувак, в наш век DX11, терафлоп и marching cubes на проективной сетке – ты ебанулся так писать”.

    Не полетят. Пусть сначала попробуют отрендерить мир на карточке из списка минимальных требований с приемлемым fps.
    Кстати, у вас ландшафт по всей карте уникальный или собирается из повтояющихся блоков?

  • IronPeter

    >Кстати, у вас ландшафт по всей карте уникальный или собирается из повтояющихся блоков?

    Весь уникальный, копипаст возможен кусками ( с клипбоардом, translate & rotate ).

  • Dmitry Tyurev

    А мэппинг автоматический/планарный или можно его корректировать? Например, можно ли положить вдоль дороги ориентированную текстуру? Или на склоны гор/оврагов положить текстуру с вертикальными разломами.

  • IronPeter

    Я там писал пару строк про

    >>Пин 2.) Устранение потяжек на вертикальных склонах.

    В принципе устраивает. Можно бы было делать деколами многое ( всякие ориентированные дороги и прочее ), но их очень сложно по перфомансу вытягивать. Пусть лучше дизайнеры останутся в святой уверенности, что такой фичи нет :).

    Думаю, что помогла бы возможность тянуть uv мапинг “руками”. Если бы не делал xyz текстурирование – делал бы ее.

  • Pingback: highly professional scums » Blog Archive » Ландшафтный дизайн, часть два.()