Clipmaps


The Presentation inside:

Slide 0

Clipmaps Макаров Евгений


Slide 1

Текстурирование рельефа Тайлинг с использованием тайлсетов Использование альфа-смешивания Текстурирование с использованием оригинальных изображений высокого разрешения


Slide 2

Тайлинг Игры основанные на тайлах Warcraft Civilization Heroes of Might and Magic и т.д. Возможность использования процедурных текстур Маленьких размер используемых данных Необходимость создания “tile set’ов” Ограниченные возможности при визуализации Сложность использования и внесения изменений


Slide 3

Альфа-смешивание Использует предварительно подобранные наборы текстур для смешивания


Slide 4

Альфа-смешивание - результаты Возможность создавать сложные текстуры Ограниченный набор исходных текстур


Slide 5

Использование больших текстур Неограниченная сложность What you see is what you get ? Это просто


Slide 6

Авиасимуляторы 0 1 2 3 0 1 2 3 уменьшение детализации Ландшафт используемая информация


Slide 7

Случай FPS Используемая информация зависит только от позиции наблюдателя В каждом кадре используется небольшая часть информации из мип-уровней Ландшафт уменьшение детализации


Slide 8

Структура клипмапа


Slide 9

C Тороидальное обновление A B C D E F G A B C D E F G D E F G A B C D E C D E E F G A B C D центр стека первоначальный уровень с новыми данными используем wrap(repeat) адресацию новый центр необновляемые данные не затрагиваются


Slide 10

I M I Тороидальное обновление (шаг 2) A B C D E F G E F B C D E F B C D уровень с новыми данными используем wrap(repeat) адресацию E F G A B C D H I J K L M N H I J K L M N H I J K L J K L M J K L M N H I J K L M N используем новую позицию центра для определения данных для загрузки


Slide 11

Хранение исходных данных Высокая степень сжатия необходимость хранения больших объемов данных большее сжатие позволяет использовать более детальные карты Доступность возможность произвольного доступа в реальном времени Простота редактирования формат должен позволять легко вносить изменения


Slide 12

Использование JPEG компрессии Преимущества Высокий уровень сжатия исходного изображения Возможность контроля качества и размера итогового изображения Ускорение декомпрессии с использованием GPU Широкая распространенность формата


Slide 13

Использование JPEG компрессии Недостатки Необходимость предварительной обработки на стороне CPU Передача большого количества данных на GPU (возможны оптимизации)


Slide 14

Clipmap в DX10 Для пирамиды используем 2D текстуру с мип-уровнями Для стека используем массив текстур Текстура с мип-уровнями Массив текстур(Texture array) Пирамида Стек


Slide 15

Texture array в DX10 Структура, содержащая в себе набор обычных текстур одинакового размера и формата Создание ID3D10Texture2D *pTexture; D3D10_TEXTURE2D_DESC texDesc; ... texDesc.ArraySize = levelsNum; ... pd3dDevice->CreateTexture2D( &texDesc, NULL, &pTexture ); Адресация _Texture.Sample( _Sampler, float3( texCoord.xy, level ) );


Slide 16

Порядок обновления данных Подготовка исходных данных Определение новых областей для загрузки Выполнение DCT преобразований для JPEG декомпрессии Нахождение областей требующих обновления Копирование данных на стороне GPU Кэширование данных


Slide 17

Адресация к стеку Вычисление требуемого мип-уровня используя инструкции 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 Чтение из текстуры float4 color = StackTexture.Sample( stackSampler, float3( clipTexCoord, iMipLevel ) );


Slide 18

Выбор размера стека Используемое разрешение Относительное положение наблюдателя и способы его перемещения Требуемая производительность


Slide 19

Не хватает данных ? Данные всегда есть в менее детальных уровнях Требуемые данные всегда можно найти в менее детализированных уровнях Данные есть в стеке Данные есть в пирамиде


Slide 20

Недостаточный размер стека


Slide 21

Определение корректного уровня Находим мип-уровень, размер которого достаточен для чтения с использованием вычисленных текстурных координат float GetMinimumStackLevel( float2 coordinates ) { float2 distance; distance.x = abs( coordinates.x - g_StackCenter.x ); distance.x = min( distance.x, 1.0 - distance.x ); distance.y = abs( coordinates.y - g_StackCenter.y ); distance.y = min( distance.y, 1.0 - distance.y ); return max( log2( distance.x * texSize.x * 4.0 / stackSize ), log2( distance.y * texSize.y * 4.0 / stackSize) ); } центр стека текстурные координаты расстояние


Slide 22

Недостаточный размер стека


Slide 23

Используем данные из стека


Slide 24

Эффективность хранения* * Данные приводятся в мегабайтах для 32 битных текселей


Slide 25

JPEG компрессия RGB -> YCbCr R = Y + 1.402 * (Cr - 128.0); G = Y - 0.34414 * (Cb - 128.0) - 0.71414 * (Cr - 128.0); B = Y + 1.772 * (Cb - 128.0);


Slide 26

JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Глаз менее чувствителен к цвету, более чувствителен к яркости Уменьшаем разрешение для цветовых каналов Каналы обрабатываются независимо


Slide 27

JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8


Slide 28

JPEG компрессия Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT RGB -> YCbCr Кодируемые блоки представляются в виде линейной комбинации представленных квадратов


Slide 29

JPEG компрессия Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT Квантование RGB -> YCbCr


Slide 30

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


Slide 31

JPEG компрессия RGB -> YCbCr Уменьшение разрешения цветовых составляющих Разбиение на блоки 8x8 DCT Квантование Зигзагообразная перестановка Кодирование нулей Кодирование Хаффмана Вычисляем на GPU Вычисляем на CPU


Slide 32

Преимущества использования Возможность использования текстур больших размеров Легкость интеграции в существующие проекты Возможность настройки баланса между качеством и быстродействием Предлагает определенный уровень абстракции от используемой геометрии Не требует сложной предварительной подготовки


Slide 33

Ограничения Требование локальности использования данных Наибольшая эффективность достигается при последовательном использовании исходных данных


Slide 34

Почему Array, a не 3D текстура? Возможность анизотропной фильтрации Билинейная фильтрация 3D текстур Обновление 3D текстуры ??? Нет !!!


Slide 35

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


Slide 36

Вопросы


×

HTML:





Ссылка: