<
  • Главная
Статьи

Стиснення текстур - Space Engine

Як я згадував в попередньому блог-пості , Я планував реалізувати стиснення текстур рельєфу, щоб знизити вимоги до пам'яті. Всі відеокарти підтримують S3TC - алгоритм стиснення текстур з втратами, який зменшує розмір, займаний текстурою в відеопам'яті, в 2-4 рази, і «розтискає» її на льоту під час рендеринга. Декомпресія реалізована на апаратному рівні, тому вона не впливає на продуктивність (вона навіть може збільшитися в сценаріях, де важлива пропускна здатність контролера пам'яті, оскільки потік даних між VRAM і GPU зменшується в 2-4 рази).

На скріншотах в цьому пості можна переміщати повзунок для порівняння виду із застосуванням стиснення текстур і без нього. Також можна натиснути правою кнопкою миші і вибрати «Відкрити в новій вкладці", щоб розглянути скріншоти в повному дозволі (зробіть це два рази - в лівій і правій частині зображення).

Також можна натиснути правою кнопкою миші і вибрати «Відкрити в новій вкладці, щоб розглянути скріншоти в повному дозволі (зробіть це два рази - в лівій і правій частині зображення)

Original
Планета з космосу - різниця майже не помітна

Так що я реалізував стиснення текстур в формати DXT1, DXT5, LATC1 і LATC2 (або їх DirectX-еквіваленти BC1, BC3, BC4 і BC5). Стиснення виконується на льоту спеціальним шейдером, після генерації / завантаження текстури рельєфу. У наведеній нижче таблиці представлена ​​зведення форматів і їх використання в SE. Для тих, хто цікавиться деталями, ось відмінна стаття про алгоритми стиснення, що застосовуються в відкритих.

Формат Канали Коеф. стиснення Якість Використання в SE DXT1 (BC1) 3 (RGB) 1: 4 середнє не використовується DXT5 (BC3) 4 (RGBA) 1: 4 середнє не використовується DXT5 (BC3) YCoCg 3 (RGB) 1: 4 високу карта кольору (альбедо ), карта світіння (вогні міст) LATC1 (BC4) 1 (ч / б) 1: 2 високе прозорість хмар, маска води / льоду, шорсткість, висоти детальних текстур LATC2 (BC5) 2 (2x ч / б) 1: 2 високе карта нормалей 16 біт Без стиснення 1 (ч / б) 1: 1 ультра карта висот, карта температури Формат Канали Коеф Original
Тут можна помітити деяку різницю

До реалізації стиснення, текстури в SE були розкладені так:

Висоти 16 біт ч / б Колір + маска води / льоду 8 біт RGBA Нормалі 8 біт RGBA використовувалися тільки 2 канали, в 0.980 інші 2 канали зберігали 16-бітове значення висоти Світіння 8 біт RGBA альфа-канал ставив режим: вогні міст, постійні вогні , або теплове світіння; RGB частина задавала або колір вогнів, або температуру поверхні Детальні колір + шорсткість 8 біт RGBA Детальні нормалі + висоти 8 біт RGBA

У 0.990 я переключився на окрему 16-бітну текстуру для карт висот, щоб поліпшити точність і якість. Ця карта є базовою для ландшафтного движка: вона використовується для зсуву вершин сітки і генерації всіх інших карт (нормалей, кольору, світіння і т.д.). На жаль, для 16-бітових карт не існує стислих форматів S3TC. Але карта висот все одно повинна зберігатися без втрат, в максимально можливій якості.

При реалізації стиснення мені довелося відокремити альфа-канал деяких карт в окремі текстури, тому що обрані формати стиснення (YCoCg DXT5 і LATC2) не підтримують альфу. Я обрав DXT5 в колірному просторі YCoCg , Тому що він має кращу якість, ніж стандартні DXT5 або DXT1. Формат LATC2 - кращий вибір для карт нормалей (DXT-стискання призводить до занадто великим артефактів в освітленні). У цьому форматі зберігаються тільки дві компоненти вектора нормалі, третя обчислюється шейдером планети на льоту.

У цьому форматі зберігаються тільки дві компоненти вектора нормалі, третя обчислюється шейдером планети на льоту

Original

Раніше в карті теплового світіння зберігалася температура поверхні у вигляді 24-бітного значення, закодованого в RGB-каналах. Така велика точність необхідна, щоб уникнути бандінга (появи смуг - теплове випромінювання дуже чутливо до змін температури, тому температура повинна зберігатися як можна точніше). Але стиснення з втратами закодованих даних повністю руйнує їх: на вулканах і поверхнях зірок з'являються великі і дуже яскраві артефакти. Тому я відділив теплову карту в окрему текстуру, що зберігає температуру в стислому 16-бітному форматі. Планети тепер мають дві карти: стара GlowMap використовується для вогнів міст або постійних вогнів (видимих ​​навіть в денний час, наприклад, так зроблена лава на Іо) і нову TempMap ( «температурна карта»), яка просто задає температуру поверхні в Кельвіна. 16 біт можуть зберігати значення від 0 до 65535 - цілком достатньо для опису температури планети або зірки (65 тисяч кельвінів - це сліпуче синювате сяйво, більш високі температури дадуть майже такий же відтінок синього кольору). Нову карту TempMap можна задавати в скриптах точно так же, як і GlowMap; планета може мати обидві карти одночасно.

Ще один бонус виділених 16-бітних теплових карт: поверхні зірок тепер гладкі, без кидаються в очі квадратів!

Нова розкладка текстур тепер така:

Висоти 16 біт без стиснення Колір YCoCg DXT5 або LATC1 LATC1 використовується для ч / б текстур (наприклад, хмари Землі) Маска води / льоду або прозорість хмар LATC1 Нормалі LATC2 Використовуються тільки 2 канали Світіння YCoCg DXT5 або LATC1 LATC1 використовується для ч / б текстур ( наприклад, вогні міст Землі) температура 16 біт без стиснення температура в Кельвінах Детальний колір YCoCg DXT5 Детальна шорсткість LATC1 Детальні нормалі LATC2 Детальні AO LATC1 поки не реалізовано, але легко може бути додано Детальні висоти LATC1 поки не реалізовано, знадобиться для Parallax Occlusion Mapping

Так багато текстур, але вони використовують тільки 4 різних формати: 16 біт без стиснення, DXT5, LATC1 і LATC2. Існують і більш просунуті апаратні формати стиснення - BC6, BC7, ASTC і ін., Але їх проблематично використовувати в SE. Деякі занадто повільно стискаються (наприклад, BC7 - близько однієї секунди на стиск текстури 512 × 512 з використанням CUDA на GTX680, в порівнянні з 10 мс для DXT5), інші не мають широкої підтримки в відкритих для настільних систем (ASTC частіше зустрічається на мобільних пристроях ).

Original
Крупний план - помітна різниця в тонких деталях

Движок стискає текстури ландшафту відразу після їх генерації або завантаження з диска. Це не безкоштовний процес, він займає 2-5 мілісекунд на кожну текстуру, тому час завантаження збільшується на 20-50%. Але стиснення економить купу пам'яті! Важко сказати точно, скільки саме, тому що планети генерують різні набори текстур, в залежності від типу планети і висоти камери. Без стиснення кеш для 4000 нодов рельєфу споживав 1200-1500 Мбайт відеопам'яті (на LOD 0); з використанням стиснення це число падає до 500-600 Мбайт. Тому можна вважати, що середня економія - в 2,5 рази. Непогано, враховуючи, що SE і раніше використовує карти висот і температури в стислому форматі.

Я також стиснув бібліотеку матеріалів (зображення скель / гальки / трави / піску, що використовуються для генерації детальних текстур). Це було легко, тому що SE вже підтримував S3TC текстури у вигляді файлів у форматі * .dds (вони використовуються для деяких текстур кораблів і галактик). Для цього я скористався інструментами nvcompress і ImageMagic (просто написав кілька bat-файлів для автоматизації процесу). До цього 49 матеріалів займали 522 МБ відеопам'яті, тепер вони займають всього 130 МБ (в 4 рази менше). Це також прискорило завантаження бібліотеки матеріалів при запуску SE на порядок! (1 секунда замість 10).

(1 секунда замість 10)

Original
Ще один великий план - тут вже суттєва різниця. Розподіл детальних текстур будується на основі глобальних текстур планети. Якщо глобальні текстури стискаються з втратами, особливо карти нормалей, це може привести до істотно іншого результату. Обійти це можна, не стискаючи ті рівні, які використовуються для генерації детальних текстур.

Тепер в настройках графіки є опція «Стиснення текстур». Вона перемикає режим тільки для новостворюваних текстур, тобто старі текстури, які вже знаходяться в відеопам'яті, не змінюють свій формат. У будь-якому випадку, вони будуть видалені ландшафтним движком, коли буде потрібно звільнити місце для нових текстур.

Original
На світанку легко видно тонка різниця в освітленні. Це пов'язано з тим, що невелика різниця між стислими і не стислими нормалями призводить до значної зміни напрямку світла / тіні.

Є невелика проблема з Землею і іншими реальними планетами. Протягом багатьох років вони використовували незвичайний розмір текстури - 258 × 258. Відкрите не люблять розміри, які не є ступенем двійки, тому дозвіл текстур процедурних планет становить 256х256. Раніше це не було серйозною проблемою, але тепер все змінилося. Стиснення S3TC засноване на блоках розміром 4 × 4 пікселя, тому розмір текстури повинен бути кратним 4 (а 258 не ділиться на 4). Для не-кратних текстур, код стиснення додає бордюри до текстури і її мип-рівням, щоб зберегти їх розмір кратним 4. Це призводить до деякого "сповзання" текстур на рельєфі. Воно може бути виправлено шляхом застосування зворотного зсуву в шейдера, але я думаю, що краще просто переробити всі текстури реальних планет, щоб зробити їх розмір 256 × 256. Це дасть два переваги. По-перше, дозволить використовувати фіксований кеш текстур в відеопам'яті: просто виділити по 1000 текстур для кожного з 4 форматів і повторно використовувати їх, а не виділяти нову текстуру кожен раз. Я використовував динамічне виділення текстур з самого початку роботи над SE, тому що движок не може знати, який дозвіл тайлів буде у кожної наступної планети. Виділення пам'яті - повільна операція, тому повторне використання фіксованого набору текстур скоротить час генерації рельєфу. Друга перевага полягає в тому, що текстури реальних планет будуть перероблені так, щоб мати бордюри шириною в 2 пікселя, що дозволить усунути шви в картах нормалей, які вони в даний час мають.

Я експериментував зі збереженням текстур Землі в dds формат, але в результаті виходить pak-файл набагато більшого розміру, ніж з використовуваними зараз форматами jpg / png (або png без втрат в аддонах HD і Ultra). Так що SE і раніше буде використовувати формати jpg / png для зберігання текстур на диску, і віджимати їх в S3TC на льоту під час завантаження. Зате це дасть можливість відключити стиск в настройках, щоб забезпечити максимальну якість текстур реальних планет.

Обговорити цю посаду можна на форумі .



Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью