nsf gamedevСтатьи

Неудавшийся эксперимент по текстурированию ландшафта. (2 стр)

Автор:

Реализация всего метода.

О том, как я писал всё это чудо, наверно, проще будет написать по шагам. Поэтому.. по шагам. :)

1. Первым делом я должен был написать систему, которая умеет работать с слоями и масками, а также по запросу отрисовывает любой участок ландшафта в текстуру. Это не заняло много времени и не составило труда. Но, когда я её дописал, я просто не знал, как она работает. Для правильного размещения текстур, я использовал текстурные матрицы вместо текстурных координат. И делал это только потому, что дизайн движка не был подготовлен для комплексного рендеринга в несколько TMU. Позже, конечно, я понял, что всё это было грубой ошибкой и переписал систему. Она стала понятной и простой. Имеем: texture_generator_t, который запекает все слои ландшафта, а также лайтмап в одну текстуру.

2. Нужно было определиться, как же эту систему применить непосредственно к ландшафту. Для начала я немного посчитал числа на калькуляторе. Под игроком/камерой 4 512x512 текстуры = 4мб. Вокруг этих 4 текстур, 12 256х256 = 3мб. Вокруг 8 текстур ещё 20 текстур размером 128х128 = 1мб, ну и напоследок 28 текстур размером 64х64 = 0.5мб. Весь остальной ландшафт рендерится в одну большую текстуру, где каждый node получает по 32х32 пикселя площадь. Получалось, что текстуры ландшафта должны уместиться где-то в 10-20 мб видеопамяти. Результат был вполне приемлимым. Позже я добавил DXT сжатие для большой глобальной текстуры, чем поднял кол-во пикселей для каждой ноды с 32x32 до 64x64. Поразмыслив ещё разные варианты, я сделал примерную реализацию и начал работать с LOD'ом.

3. Было два варианта LOD уровней.

  - Берем N ближайших видимых nodes и сортируем их в порядке удаленности от камеры раздавая каждой свой LOD. Минусы такого подхода всплыли моментально — сложное управление лодом, частая перерисовка текстур для разных nodes.

lod1 | Неудавшийся эксперимент по текстурированию ландшафта.

  - Берем LOD прямоугольничками от наблюдателя. Такой подход имел один минус - большое кол-во невидимых nodes (половина часто). Но управление всеми nodes из LOD маски было достаточно простым. К тому же прыгал LOD только когда игрок передвигался. Поэтому перерисовывать текстуры приходилсь значительно реже.

lod2 | Неудавшийся эксперимент по текстурированию ландшафта.

Я остановился на втором варианте как более простом и понятном. Собствено вся система была написана. Проблем на пути встречалось не мало, но все они имели вполне логичное и разумное решение, поэтому я о них не упоминаю.

4. Пришло время первых тестов и запусков. Для начала я нарисовал простенький heightmap в gimp'е, а также 3 слоя к нему с помощью текстур взятых на cgtextures.com. При отстутсвии движений со стороны камеры FPS не упал вообще и держался на уровне ~300. Когда же камера двигалась и LOD переключался с одних клеток на другие, наблюдались слабозаметные рывки. Это меня не устраивало, и следующим шагом стала простейшая оптимизация. При переключении LOD'ов нужно было отрисовывать только 1 node текстуру за один кадр. Как оказалось, первая система для работы с LOD'ом для этого совсем не подходила и мне пришлось её переписать. Но в итоге я добился того, чего хотел. Слабые рывки устранены, fps по прежнему 300—400.

_s2 | Неудавшийся эксперимент по текстурированию ландшафта.

5. Теперь пришло время хардкорных тестов. Я снова взял GIMP и cgtextures.com, дорисовал слои до 10 и запустил программу. Результат меня поразил. В общем целом рывки были незаметны, если специально на них не смотреть. Движок успешно рисовал 10 слоев и fps не опускался ниже 200-300. С одной стороны я был доволен результатами, но с другой нет. Об этом дальше.

screenshot3 | Неудавшийся эксперимент по текстурированию ландшафта.

Начало разочарований.

Можно сказать я успешно надрал задницу UT2004. Мой ландшафт имел схожее качество и рендерился в 3-10 раз быстрей :) Было, конечно, несколько неприятных моментов в виде заметного LOD switching'а. Но можно было подрегулировать достаточно красиво и в совокупности с прочими игровыми компонентами (небо, деревья, камни, трава, игроки, GUI) ландшафт отходил на второй план и спокойно дополнял общее впечатление. Однако у меня был жёсткий конкурент и имя ему Blizzard. Их чудо под названием World of Warcraft рендерилось без капли тормозов на моей же карточке и при этом умудрялось иметь многослойный, качественный на всех расстояниях ландшафт. Смотрел на него близко - текстуры высокого разрешения, смотрел в даль - опять также. И это начало меня печалить. Пытаясь догнать их движок со своей системой, я переписал вначале устройство разбиения ландшафта. Появилась возможность текстурить разные по размеру nodes. Это сделать было необходимо, т.к. оказывается разница к требованиям разрешения текстур в близи под игроком и в дали очень большая. Это не просто как 512x512 vs. 32x32. Вблизи нужно гораздо более высокое разрешение. Но всё равно что-то было не так.

_s3 | Неудавшийся эксперимент по текстурированию ландшафта.

Ковырялся я ещё примерно неделю. Добавил небо к ландшафту. Прикрутил detail текстуру. Но так и не смог увеличить значительно качество и приблизить его к WoW'овскому. В итоге пришел к выводу, что правильней всего всё же рендерить ландшафт именно многопроходно (или с шейдерами на новом железе). На новую реализацию у меня не хватило желания и мотивации. Поэтому так и ушла в небытие эта технология текстуринга ландшафтов.

Надеюсь этот небольшой постмортем даст вам хоть какую-то пищу для размышлений. Может быть убережет от ещё несовершенных ошибок.

Страницы: 1 2

#terrain

2 ноября 2007 (Обновление: 5 ноя 2007)

Комментарии [1]