Clipmaps Макаров Евгений
NVIDIA Confidential Текстурирование рельефа Тайлинг с использованием тайлсетов Использование альфа-смешивания Текстурирование с использованием оригинальных изображений высокого разрешения
NVIDIA Confidential Тайлинг Игры основанные на тайлах Warcraft Civilization Heroes of Might and Magic и т.д. Возможность использования процедурных текстур Маленьких размер используемых данных Необходимость создания tile setов Ограниченные возможности при визуализации Сложность использования и внесения изменений
NVIDIA Confidential Альфа-смешивание Использует предварительно подобранные наборы текстур для смешивания
NVIDIA Confidential Альфа-смешивание - результаты Возможность создавать сложные текстуры Ограниченный набор исходных текстур
NVIDIA Confidential Использование больших текстур Неограниченная сложность What you see is what you get Это просто
NVIDIA Confidential Авиасимуляторы уменьшение детализации Ландшафт используемая информация
NVIDIA Confidential Случай FPS Используемая информация зависит только от позиции наблюдателя В каждом кадре используется небольшая часть информации из мир-уровней Ландшафт уменьшение детализации
NVIDIA Confidential Структура клип мара
NVIDIA Confidential C Тороидальное обновление ABCD E F G ABCD E F G D E F G ABCD E CD E E F G ABCD центр стека первоначальный уровень с новыми данными используем wrap(repeat) адресацию новый центр не обновляемые данные не затрагиваются
NVIDIA Confidential I M I Тороидальное обновление (шаг 2) ABCD E F G E F BC D E F BCD уровень с новыми данными используем wrap(repeat) адресацию E F G ABCD HIJK L M N HIJK L M N HIJK L JK L M JK L M N HI JK L M N используем новую позицию центра для определения данных для загрузки
NVIDIA Confidential Хранение исходных данных Высокая степень сжатия необходимость хранения больших объемов данных большее сжатие позволяет использовать более детальные карты Доступность возможность произвольного доступа в реальном времени Простота редактирования формат должен позволять легко вносить изменения
NVIDIA Confidential Использование JPEG компрессии Преимущества Высокий уровень сжатия исходного изображения Возможность контроля качества и размера итогового изображения Ускорение декомпрессии с использованием GPU Широкая распространенность формата
NVIDIA Confidential Использование JPEG компрессии Недостатки Необходимость предварительной обработки на стороне CPU Передача большого количества данных на GPU (возможны оптимизации)
NVIDIA Confidential Clipmap в DX10 Для пирамиды используем 2D текстуру с мир- уровнями Для стека используем массив текстур Текстура с мир-уровнями Массив текстур(Texture array) Пирамида Стек
NVIDIA Confidential Texture array в DX10 Структура, содержащая в себе набор обычных текстур одинакового размера и формата Создание ID3D10Texture2D *pTexture; D3D10_TEXTURE2D_DESC texDesc;... texDesc.ArraySize = levelsNum;... pd3dDevice->CreateTexture2D( &texDesc, NULL, &pTexture ); Адресация _Texture.Sample( _Sampler, float3( texCoord.xy, level ) );
NVIDIA Confidential Порядок обновления данных Подготовка исходных данных Определение новых областей для загрузки Выполнение DCT преобразований для JPEG декомпрессии Нахождение областей требующих обновления Копирование данных на стороне GPU Кэширование данных
NVIDIA Confidential Адресация к стеку Вычисление требуемого мир-уровня используя инструкции ddx и ddy float2 dx = ddx(input.texCoord * textureSize.x); float2 dy = ddy(input.texCoord * textureSize.y); float d = max( sqrt( dx.x * dx.x + dx.y * dx.y ) ), sqrt( dy.x * dy.x + dy.y * dy.y ) ) ); float mipLevel = log2( d ); Вычисление текстурных координат float2 clipTexCoord = input.texCoord / pow( 2, iMipLevel ); clipTexCoord.x *= scaleFactor.x; clipTexCoord.y *= scaleFactor.y; clipTexCoord += 0.5f Чтение из текстуры float4color = StackTexture.Sample( stackSampler, float3( clipTexCoord, iMipLevel ) );
NVIDIA Confidential Выбор размера стека Используемое разрешение Относительное положение наблюдателя и способы его перемещения Требуемая производительность
NVIDIA Confidential Не хватает данных ? Данные всегда есть в менее детальных уровнях Требуемые данные всегда можно найти в менее детализированных уровнях Данные есть в стеке Данные есть в пирамиде
NVIDIA Confidential Недостаточный размер стека
NVIDIA Confidential Определение корректного уровня Находим мир-уровень, размер которого достаточен для чтения с использованием вычисленных текстурных координат float GetMinimumStackLevel( float2 coordinates ) { float2 distance; distance.x = abs( coordinates.x - g_StackCenter.x ); distance.x = min( distance.x, distance.x ); distance.y = abs( coordinates.y - g_StackCenter.y ); distance.y = min( distance.y, distance.y ); return max( log2( distance.x * texSize.x * 4.0 / stackSize ), log2( distance.y * texSize.y * 4.0 / stackSize) ); } центр стека текстурные координаты расстояние
NVIDIA Confidential Недостаточный размер стека
NVIDIA Confidential Используем данные из стека
NVIDIA Confidential Эффективность хранения* Размеры текстур Полная текстура clipmap13.3(16%)17.3(5%)25.3(
NVIDIA Confidential JPEG компрессия RGB -> YCbCr R = Y * (Cr ); G = Y * (Cb ) * (Cr ); B = Y * (Cb );
NVIDIA Confidential JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Глаз менее чувствителен к цвету, более чувствителен к яркости Уменьшаем разрешение для цветовых каналов Каналы обрабатываются независимо
NVIDIA Confidential JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8
NVIDIA Confidential JPEG компрессия Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT RGB -> YCbCr Кодируемые блоки представляются в виде линейной комбинации представленных квадратов
NVIDIA Confidential JPEG компрессия Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT Квантование RGB -> YCbCr
NVIDIA Confidential JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT Квантование Зигзагообразная перестановка Перестановка используется для группировки компонент по частотам 26, 3, 0, 3, 2, 6, 2, 4, 1, 4, 1, 1, 5, 1, 2, 1, 1, 1, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
NVIDIA Confidential JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT Квантование Зигзагообразная перестановка Кодирование нулей Кодирование Хаффмана Вычисляем на GPU Вычисляем на CPU
NVIDIA Confidential Преимущества использования Возможность использования текстур больших размеров Легкость интеграции в существующие проекты Возможность настройки баланса между качеством и быстродействием Предлагает определенный уровень абстракции от используемой геометрии Не требует сложной предварительной подготовки
NVIDIA Confidential Ограничения Требование локальности использования данных Наибольшая эффективность достигается при последовательном использовании исходных данных
NVIDIA Confidential Почему Array, a не 3D текстура? Возможность анизотропной фильтрации Билинейная фильтрация 3D текстур Обновление 3D текстуры ??? Нет !!!
NVIDIA Confidential Cсылки [1] Christopher C. Tanner, Christopher J. Migdal, and Michael T. Jones The Clipmap: A Virtual Mipmap, Silicon Graphics Computer Systems [2] NVIDIA DirectX SDK 10 Clipmaps demo
NVIDIA Confidential Вопросы