ПрограммированиеСтатьиГрафика

Использование мегатекстур (megatexture, clipmaps). (2 стр)

Автор:

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

Оптимизация.

Некоторые схемы технологии clipmaps, говорящие сами за себя.

image_cache | Использование мегатекстур (megatexture, clipmaps).

texregion_update | Использование мегатекстур (megatexture, clipmaps).

Персонажи в игре и др. объекты.

Используемый подход с мегатекстурой наталкивает на то, чтобы при выводе персонажей, автомобилей и др. небольших объектов, также самому рассчитывать необходимый уровень детализации (один, два или три для возможности использование аппаратных средств фильтрации) и только их грузить в GPU, а не все лоды текстуры объекта. Это позволит иметь высокодетализированную текстуру объекта без ущерба  производительности и качества растеризации модели. Конечно, тут речь не идет о вырезании частей из текстуры объекта и применении полноценного clipmaps, достаточно просто выбрать нужные лоды всей текстуры, например, по расстоянию объекта от камеры.

Выводы.

Различия технологий 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 Мб

2. Исходники на C++

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

Страницы: 1 2

#clipmaps, #cliptexture, #megatexture, #мегатекстура

9 ноября 2007 (Обновление: 30 июля 2014)

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