KTX в Dagon
Наконец-то реализовал давнюю идею поддержки текстур в формате KTX (Khronos Texture). Это контейнер, специально созданный для OpenGL и Vulkan и поддерживающий большое количество форматов текстур, включая сжатые. Особенно интересен KTX2, который позволяет хранить текстуры в формате Basis Universal – он хорош тем, что позволяет при создании игровых ресурсов не волноваться, что сжатие не будет поддерживаться на системах каких-то пользователей. Формат сжатия выбирается движком игры на основе информации от видеодрайвера, а затем текстура на лету транскодируется в этот формат. Эта фича нужна главным образом на мобильных платформах, но и в десктопном движке не помешает – Basis Universal сжимает очень эффективно и транскодируется в S3TC или BPTC за считанные мгновения.
Текстура KTX1/KTX2 загружается в объект KTXAsset, при его создании необходимо указать приоритет транскодирования. Если это TranscodePriority.Size
, то загрузчик отдает предпочтение S3TC, если TranscodePriority.Quality
– BPTC (при наличии поддержки). Также можно использовать TranscodePriority.Uncompressed, чтобы получить наилучшее качество – текстура будет распакована в RGBA8.
Пример:
KTXAsset aTextureBox;
KTXAsset aTextureEnvmap;
// На стадии запроса ассетов:
aTextureBox = this.addKTXAsset("data/box.ktx2", TranscodePriority.Size);
aTextureEnvmap = this.addKTXAsset("data/cubemap.ktx2", TranscodePriority.Quality);
// При создании материалов:
material.baseColorTexture = aTextureBox.texture;
environment.ambientMap = aTextureEnvmap.texture;