Un système de transcodage de texture compressé par GPU Portable LDR / HDR.
Base Universal est un système d'interchange de texture compressé LDR / HDR Open Source de Binomial LLC qui prend en charge deux formats de fichiers intermédiaires: la norme ouverte .ktx2 à partir du groupe Khronos et notre propre format de fichiers ".basis". Ces formats de fichiers prennent en charge le transcodage rapide à pratiquement tous les formats de texture GPU compressés publiés au cours des ~ 25 dernières années.
Notre objectif global avec ce projet est de simplifier le codage et la distribution efficace de la texture GPU, l'image et le contenu vidéo de la texture HDR portable d'une manière compatible avec n'importe quel GPU ou API de rendu / graphique.
Le système prend en charge trois modes: etc1s, Uastc LDR et UASTC HDR. Le codeur C / C ++ et les libaires transcodeurs peuvent être compilés en code natif ou webassembly, et toutes les fonctionnalités d'encodeur / transcodeur sont accessibles à partir de JavaScript.
Notes de libération
Encodeur en direct / transcoder webgl Exemples
API JavaScript / wasm / webgl info
Uastc HDR Exemple d'images
Les fichiers ETC1S et UASTC LDR peuvent être transcodés vers:
Les fichiers Uastc HDR peuvent être transcodés pour:
ETC1S: un mode supercompressé à peu près .3-3BPP de faible qualité basé sur un sous-ensemble d'etc1 appelé "etc1s". Ce mode prend en charge la qualité des variables par rapport aux niveaux de taille de fichier (comme JPEG), les canaux alpha, la compression intégrée et les tableaux de texture éventuellement compressés comme séquence vidéo à l'aide de blocs de skip (réapprovisionnement conditionnel). Ce mode peut être rapidement transcodé à tous les formats de texture LDR pris en charge.
UASTC LDR: Un mode de haute qualité de 8 bits / pixels LDR. Uastc LDR est un sous-ensemble de 19 mode du format de texture ASTC LDR 4X4 (8BPP) standard, mais avec un format de bloc personnalisé contenant des conseils de transcodage. Le transcodage UASTC LDR vers ASTC LDR et BC7 est particulièrement rapide et simple, car UASTC LDR est un sous-ensemble commun de BC7 et ASTC. Les transcodeurs des autres formats de texture sont accélérés par plusieurs bits d'indices spécifiques au format présent dans chaque bloc LDR UASTC.
Ce mode prend en charge une étape post-processus optimisée par la distorsion de taux facultative (RDO) qui conditionne les données de texture UASTC LDR codées dans le fichier .ktx2 / .basis afin qu'il puisse être compressé plus efficacement. Plus de détails ici.
Voici le document de spécification UASTC LDR.
Voici le document de spécification UASTC HDR et quelques exemples d'images compressées.
Les fichiers .basis et .ktx2 prennent en charge les niveaux MIPMAP, les tableaux de texture, les cubemaps, les tableaux cubimap et la vidéo de texture, dans les trois modes. De plus, les fichiers .basis prennent en charge les tableaux de texture non uniformes, où chaque image du fichier peut avoir une résolution ou un nombre de niveaux MIPMAP différents.
En mode ETC1s, le compresseur est capable d'exploiter les corrélations de couleur et de motif sur toutes les images de l'ensemble du fichier à l'aide des livres de codes de point de terminaison global, de sorte que plusieurs images avec MIPMAP peuvent être stockées efficacement dans un seul fichier. Le mode ETC1S prend également en charge de courtes séquences vidéo, avec des blocs de baisse (réapprovisionnement conditionnel) utilisés pour ne pas envoyer de blocs qui n'ont pas changé par rapport à la trame précédente.
Les formats d'image LDR pris en charge pour la lecture sont .png, .dds avec mipmaps, .tga, .qoi et .jpg. Les formats d'image HDR pris en charge pour la lecture sont .exr, .hdr et .dds avec MIPMAP. Il peut écrire .basis, .ktx2, .dds, .ktx (v1), .astc, .out, .exr et .png.
Le système prend désormais en charge le chargement des fichiers 2D .dds de base avec des MIPMAP facultatifs, mais le fichier .dds doit être dans l'un des formats non compressés pris en charge: 24BPP RGB, 32BPP RGBA / BGRA, RGBA à demi-FLOAT ou Float RGBA. L'utilisation de fichiers .dds permet à l'utilisateur de contrôler exactement comment les MIPMAP sont générés avant la compression.
La bibliothèque d'encodage et l'outil de ligne de commande n'ont pas de dépendances tierces requises qui ne sont pas déjà dans le dépôt lui-même. Le transcoder est un seul fichier source .cpp (dans transcoder/basisu_transcoder.cpp
) qui n'a pas de dépendances tierces.
Nous construisons et testons sous:
Sous Windows avec Visual Studio, vous pouvez utiliser le fichier basisu.sln
inclus. Alternativement, vous pouvez utiliser CMake pour créer de nouveaux fichiers de solution / projet.
Pour construire, installez d'abord Cmake, puis:
cd build
cmake ..
make
Pour construire avec SSE 4.1 Prise en charge des systèmes x86 / x64 (le codage est environ 15-30% plus rapidement), ADD -DSSE=TRUE
à la ligne de commande CMake. Add -DOPENCL=TRUE
à construire avec la prise en charge (facultative) OpenCL. Utilisez -DCMAKE_BUILD_TYPE=Debug
pour construire en débogage. Pour construire des exécutables 32 bits, ajoutez -DBUILD_X64=FALSE
.
Après la construction, l'outil de ligne de commande native utilisé pour créer, valider et transcoder / déballer .basis / .ktx2 Les fichiers sont bin/basisu
.
L'outil de ligne de commande comprend certains tests de codage / transcodage LDR / HDR automatisé:
cd ../bin
basisu -test
basisu -test_hdr
Pour tester le codec en mode OpenCL (doit avoir installé OpenCL Libs / Headers / pilotes et avoir compilé la prise en charge d'OpenCL en exécutant CMake avec -DOPENCL=TRUE
):
basisu -test -opencl
basisu -q 255 x.png
basisu -linear x.png
basisu -uastc x.png
basisu x.exr
Remarquez le lecteur .exr que nous utilisons est TinyExr, qui ne prend pas en charge tous les modes de compression .exr possibles. Des outils comme ImageMagick peuvent être utilisés pour créer des fichiers .exr que TinyExr peut lire.
Alternativement, les images LDR (telles que .png) peuvent être compressées à UASTC HDR en spécifiant -hdr
. Par défaut, les images LDR, lorsqu'elles sont compressées en UASTC HDR, sont d'abord converties de SRGB en lumière linéaire avant compression. Cette étape de conversion peut être désactivée en spécifiant -hdr_ldr_no_srgb_to_linear
.
Surtout, pour la meilleure qualité, vous devez fournir BaserU avec des images source non compressées originales . Tout autre type de compression avec perte appliquée avant la base (y compris etc1 / BC1-5, BC7, JPEG, etc.) provoquera des artefacts multigénérationnels dans les textures de sortie finale.
-fastest
(qui est équivalent à -uastc_level 0
) place les encodeurs UASTC LDR / HDR dans leurs modes les plus rapides (mais de qualité inférieure).
-slower
met les encodeurs UASTC LDR / HDR dans des modes de meilleure qualité mais plus lents (équivalent à -uastc_level 3
). Le niveau par défaut est 1 et le plus élevé est 4 (ce qui est assez lent).
-q X
, où X va de [1 255], contrôle le niveau de compromis de qualité et de taille de fichier du mode etc1s. 255 est la plus haute qualité et la valeur par défaut est 128.
-debug
amène l'encodeur à imprimer des informations de débogage verbeux internes et orientées vers les développeurs.
-stats
pour voir diverses statistiques de qualité (PSNR).
-linear
: etc1s par défaut des métriques ColorSpace SRGB, UASTC LDR utilise actuellement toujours des mesures linéaires, et UASTC HDR par défaut des métriques RVB pondérées (avec 2,3,1 poids). Si l'entrée est une carte normale, ou un autre type de contenu de texture non SRGB (non photographique), assurez-vous d'utiliser -linear
pour éviter des artefacts supplémentaires inutiles. (Les métriques de la carte normale angulaire pour UASTC LDR / HDR sont définitivement faisables et sur notre liste de TOD.)
La spécification -opencl
permet le mode OpenCL, qui accélère actuellement uniquement le codage etc1.
Le compresseur est multithread par défaut, qui peut être désactivé à l'aide de l'option -no_multithreading
de commande. Le transcoder est actuellement unique, bien qu'il soit sûr de fil (c'est-à-dire qu'il prend en charge la décompression de plusieurs tranches de texture en parallèle).
basisu -uastc -uastc_rdo_l 1.0 -mipmap x.png
-uastc_rdo_l X
contrôle le réglage de qualité RDO (taux d'optimisation de distorsion de taux). Plus cette valeur est faible, plus la qualité est élevée, mais plus la taille du fichier compressé est grande. Les bonnes valeurs à essayer sont comprises entre .2-3.0. La valeur par défaut est 1.0.
basisu -mipmap -q 200 x.png
Il existe plusieurs options MIPMAP pour modifier le noyau de filtre, l'espace de couleurs filtrant pour les canaux RVB (linéaire vs SRGB), la plus petite dimension MIPMAP, etc. L'outil prend également en charge les fichiers cubemap générateurs, les réseaux de texture 2D / Cumbemap, etc. Le générateur MIPMAP automatique, vous pouvez créer des fichiers de texture .dds LDR ou HDR non compressés et les alimenter au compresseur.
basisu -comp_level 2 x.png
Sur certaines images rares (celles avec des gradients de ciel bleu se lient), vous devrez peut-être augmenter le réglage etc1 -comp_level
, qui varie de 1,6. Cela contrôle la quantité d'effort global que le codeur utilise pour optimiser les livres de codes ETC1S et le flux de données compressé. Les COMP_Level plus élevés sont nettement plus lents.
basisu x.png -comp_level 2 -max_endpoints 16128 -max_selectors 16128
basisu -tonemap x.exr
basisu -compare a.png b.png
basisu -compare_hdr a.exr b.exr
Voir le texte d'aide pour une liste complète des options de ligne de commande de l'outil. L'outil de ligne de commande est juste un mince wrapper sur le dessus de la bibliothèque d'encodeur.
Vous pouvez utiliser l'outil de ligne de commande ou appeler le transcoder directement à partir du code JavaScript ou C / C ++ pour décompresser les fichiers .ktx2 / .basis aux données de texture GPU ou des données d'image non compressées. Pour déballer un fichier .ktx2 ou.basis sur plusieurs fichiers .png / .exr / .ktx / .dds:
basisu x.ktx2
Utilisez les options -no_ktx
et -etc1_only
/ -format_only
pour déballer dans moins de fichiers.
-info
et -validate
affichera simplement des informations de fichier et ne publieront aucun fichier.
Les fichiers MIPMAPAP, CUBEMAP ou TEXTURES. KTX / .DDS seront dans une grande variété de formats de texture GPU compressés (PVRTC1 4BPP, etc. Malheureusement (à partir de 2024) toujours pas un seul outil de vue .KTX ou .DDS qui prend en charge correctement et de manière fiable chaque format de texture GPU que nous prenons en charge. Les fichiers BC1-5 et BC7 sont visibles à l'aide du compresseur d'AMD, etc. / 2 à l'aide de l'outil de compression de texture de Mali, et PVRTC1 à l'aide de PvrTextool d'imagination. RenderDoc a une visionneuse de fichiers de texture utile pour de nombreux formats. Le Mac OSX Finder prend en charge la prévisualisation des fichiers .exr et .ktx dans divers formats GPU. L'explorateur Windows 11 peut prévisualiser les fichiers .DDS. La visionneuse OpenHDR en ligne est utile pour consulter les fichiers image .Exr / .hdr.
Le répertoire «Webgl» contient quatre démos Webgl simples qui utilisent le transcoder et le compresseur compilé pour WASM avec Emscripten. Ces démos sont en ligne ici. Voir plus de détails dans le fichier ReadMe ici.
Le transcodeur et l'encodeur peuvent être compilés à l'aide d'Emscripten sur WebAssembly et utilisés sur le Web. Un ensemble de wrappers JavaScript sur le codec, écrit en C ++ avec des extensions EMScripten, est situé dans webgl/transcoding/basis_wrappers.cpp
. Le wrapper JavaScript prend en charge presque toutes les fonctionnalités et modes, y compris la vidéo de texture. Voir les fichiers readme.md et cmakelists.txt dans webgl/transcoder
et webgl/encoder
.
Pour construire le transcoder WasM, après avoir installé Emscripten:
cd webgl/transcoder/build
emcmake cmake ..
make
Pour construire le codeur WasM:
cd webgl/encoder/build
emcmake cmake ..
make
Il existe deux démos Web de codage / transcodage simples, situées dans webgl/ktx2_encode_test
et webgl/texture_test
, qui montrent comment utiliser les API de wrapper JavaScript de l'encodeur et le transcoder.
Quelques exemples simples montrant comment appeler directement les API C ++ Encodeur et Transcoder Library sont en example/examples.cpp
.
Voir le wiki ici.
Vous pouvez télécharger et installer une base universelle à l'aide du gestionnaire de dépendance VCPKG:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install basisu
Le port universel de base dans VCPKG est tenu à jour par les membres de l'équipe Microsoft et les contributeurs communautaires. Si la version est obsolète, veuillez créer une demande de problème ou d'extraction sur le référentiel VCPKG. (9/10/2024: le support HDR UASTC n'est pas encore disponible ici.)
Les bibliothèques de transcoder et d'encodeur de base sont Apache 2.0. Le transcoder n'utilise aucune bibliothèque ou dépendance tierce. Voir la licence.
La bibliothèque d'encodeur est Apache 2.0, mais il utilise certains modules de tiers open source (dans «Encodeur / 3rdParty» et dans le répertoire «ZSTD») pour charger .qoi, .dds, .Exr Images pour gérer la compression ZSTD et pour déballer les blocs de texture ASTC. Voir les licences et les dossiers.
Le référentiel a été mis à jour pour être conforme à l'outil de vérification des licences de réutilisation (https://reuse.software/). Voir le sous-répertoire .reuse
.
Visionneuse en ligne .exr HDR Image File
Vue d'image Windows HDR + WCG - une véritable visionneuse d'image HDR pour Windows. Voir également le dépôt GitHub.
Renderdoc
Compresseur AMD
DirectXtex de Microsoft
PvrTextool
Outil de compression de texture Mali - maintenant obsolète
Pour des liens, des articles et des outils / bibliothèques plus utiles, consultez la fin de la spécification de texture HDR UASTC.
E-mail: info @ binomial dot info, ou contactez-nous sur Twitter
Voici la page Wiki des sponsors.