Использование мегатекстур (megatexture, clipmaps). (2 стр)
Автор: UnitPoint
Clipmaps.
Все, что я рассказывал до этого, было способом, который я использую в демонстрационном примере, он отличается от технологии clipmaps тем, что может быть реализован без применения пиксельных шейдеров (PS). Но применение PS позволяет существенно ускорить растеризацию, качество результирующей картинки и еще более упростить процесс.
Изменение в описанном алгоритме начинаются отсюда: «После того, как в рантайме будут сформированы нужные части мегатекстуры, остается только вывести для каждого используемого уровня детализации геометрию ландшафта, которую он охватывает». Так вот, в технологии clipmaps нужно просто вывести всю геометрию ландшафта за один проход, подав на вход PS подготовленные лоды, например, в текстурных регистрах или создать texture array для DirectX 10.
Еще одно важное замечание: для clipmaps все лоды должны иметь одинаковый размер, это существенно упростит PS (возможно это выглядело не явно, но в моем тестовом примере лоды могли иметь не одинаковые разрешения, см. схему 3).
Для того, чтобы в PS определить из какого лода брать пиксель, можно воспользоваться следующим алгоритмом:
float2 dx = ddx(input.texCoord * textureSize.x); float2 dy = ddy(input.texCoord * textureSize.y); float dd = max(sqrt(dx.x * dx.x + dx.y * dx.y)), sqrt(dy.x * dy.x + dy.y * dy.y))); float mipLevel = log2(dd);
Затем определить текстурные координаты:
float2 texCoord = input.texCoord / pow( 2, int(mipLevel) ) + 0.5;
В Nvidia SDK под DirectX 10 есть, кстати, пример работы с clipmaps!
http://developer.download.nvidia.com/SDK/10/Samples/Clipmaps.zip
Оптимизация.
1. Как вы уже поняли, технология заключается в формировании в рантайме вокруг игрока лодов размером с clipmap, содержащих необходимую часть мегатекстуры. Пересоздавать лоды при каждом изменении игроком своей позиции было бы слишком накладно, поэтому делать это есть смысл, когда игрок отошел на некоторое расстояние от предыдущей позиции, участвовавшей в формировании текущих лодов.
2. Так как мегатекстура может занимать огромные объемы информации, есть смысл оптимизировать механизм адресации к нужным участкам мегатекстуры на диске. Для этого можно поделить все лоды мегатекстуры на блоки фиксированной величины, например, в моем тестовом примере это 128 на 128 пикселей. Также это увеличит кэшируемую часть мегатекстуры в памяти, что уменьшит количество обращений к диску.
3. У меня в тестовом примере мегатекстура разбита на фрагменты, которые находятся в папке textures\mega-8192. Это далеко не самый оптимальный вариант. Лучше поместить все фрагменты в один файл. Это позволит открыть файл с мегатекстурой только один раз при первом ее использовании в программе, что увеличит общую скорость подгрузки фрагментов с диска.
4. Фрагменты могут быть ужаты. Это не только увеличит скорость подгрузки, но и уменьшит объем мегатекстуры.
5. Фрагменты менее детализированных лодов будут видны игроку на некотором расстоянии от него, поэтому они могут быть ужаты с более высокими степенями сжатия за счет уменьшения качества (незначительные дефекты могут быть незаметны на расстоянии).
6. В программе должен быть реализован эффективный механизм кэширования фрагментов, чтобы, как минимум, не загружать с диска фрагменты, уже имеющиеся в памяти, а в идеале иметь в системной памяти как можно больше фрагментов, которые могут понадобиться в ближайшее время.
7. При формировании нужных частей мегатекстуры (вокруг игрока) нужно иметь в виду, что, скорее всего, далеко не все лоды будут нужны для растеризации (см. схему 3), это может существенно уменьшить объемы подгружаемых данных с диска и общий размер текстур, загружаемых в GPU.
8. Размер clipmap может быть не кратным 2, т.к. GPU уже давно умеют работать с такими текстурами.
9. Размер clipmap можно изменять на лету, например, при высокой скорости перемещения игрока размер clipmap можно уменьшить, это уменьшит количество подгружаемых фрагментов каждого уровня детализации, что приведет к общему уменьшению подгружаемых фрагментов. Кроме этого, уменьшится размер видео памяти, требуемой для растеризации.
Некоторые схемы технологии clipmaps, говорящие сами за себя.


Персонажи в игре и др. объекты.
Используемый подход с мегатекстурой наталкивает на то, чтобы при выводе персонажей, автомобилей и др. небольших объектов, также самому рассчитывать необходимый уровень детализации (один, два или три для возможности использование аппаратных средств фильтрации) и только их грузить в GPU, а не все лоды текстуры объекта. Это позволит иметь высокодетализированную текстуру объекта без ущерба производительности и качества растеризации модели. Конечно, тут речь не идет о вырезании частей из текстуры объекта и применении полноценного clipmaps, достаточно просто выбрать нужные лоды всей текстуры, например, по расстоянию объекта от камеры.
Выводы.
1. Технология применения мегатекстур (clipmaps) позволяет практически снять ограничения на размер текстур, используемых в приложении (как по их разрешению, так и по их объему) и совершено не упирается в границы разрешений, поддерживаемых аппаратно GPU.
2. Художник может изменять любую область текстуры согласно концепт-дизайна без каких-либо на то ограничений со стороны технологии.
3. Технология позволяет в разы увеличить реалистичность виртуального мира.
4. Технология имеет высокий потенциал для оптимизации различных этапов.
5. Технологию полностью поддерживают аппаратная растеризация и возможности GPU.
Различия технологий Megatexture и Clipmaps.
Технология Clipmaps или ClipTextures была разработана компанией SGI и уже достаточно давно применяется для текстурирования больших ландшафтов. Суть технологии я описал в предыдущих частях.
Джон Кармак (John Carmack – co-owner, technical director id Software) при разработке движка Tech 4 (финальная его версия была использована в игре Enemy Territory: Quake Wars) ввел термин megatexture. Его технология полностью повторяет clipmaps с добавлением следующих моментов: megatexture содержит маску для добавочных текстур повышенной детализации и информацию о типе материала (трава, камень и т.п.).
На мой взгляд, отличия мизерны. Но его название лучше отражает суть технологии и ее главные преимущества, в то время как название clipmaps лучше отражает программную реализацию.
Скачать.
1. Откомпилированная программа с мега текстурой - 200 Мб
P.S. Важно: изначально программа представляла собой пробу пера использования мегатекстур, выкладывать код или распространять ее умысла не было. Поэтому за основу кода я взял одну из своих предыдущих программ. Как следствие в исходниках есть много кода, который к самой мегатекстуре не имеет отношения. Я рекомендую начинать смотреть код с файла src\xMegaTexture.h и тот код, который вызывает его функции.
Вопросы?
Добро пожаловать на форум статьи: http://www.gamedev.ru/code/forum/?id=72131
Используемый материал.
1. OpenGL Performer Programmer's Guide: ClipTextures
2. http://www.modwiki.net/wiki/Id_Tech_4
#clipmaps, #cliptexture, #megatexture, #мегатекстура
9 ноября 2007 (Обновление: 30 июля 2014)