Неудавшийся эксперимент по текстурированию ландшафта. (2 стр)
Автор: nsf
Реализация всего метода.
О том, как я писал всё это чудо, наверно, проще будет написать по шагам. Поэтому.. по шагам. :)
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.