Un sistema de transcodificación de textura comprimida Portable GPU LDR/HDR.
BASE Universal es un sistema de intercambio de textura comprimido LDR/HDR de código abierto de código abierto de Binomial LLC que admite dos formatos de archivos intermedios: el estándar abierto .KTX2 del grupo Khronos y nuestro propio formato de archivo ".Basis". Estos formatos de archivo admiten la transcodificación rápida a prácticamente cualquier formato de textura de GPU comprimido lanzado en los últimos ~ 25 años.
Nuestro objetivo general con este proyecto es simplificar la codificación y la distribución eficiente de la textura de GPU, imagen y contenido de video de GPU portátiles de GPU de una manera que es compatible con cualquier API GPU o Rendering/Graphics.
El sistema admite tres modos: ETC1S, UASTC LDR y UASTC HDR. El codificador y transcodificador C/C ++ se puede compilar a código nativo o WebAssembly, y se puede acceder a todas las características del codificador/transcodificador desde JavaScript.
Notas de lanzamiento
Ejemplos de codificador en vivo/transcoder web
Información de JavaScript API/WASM/WebGL
Imágenes de ejemplo de UASTC HDR
Los archivos ETC11 y UASTC LDR se pueden transcodar a:
Los archivos UASTC HDR se pueden transcodar a:
ETC1S: un modo supercomprimido de baja a mediana calidad de .3-3-3ppp basado en un subconjunto de ETC1 llamado "ETC1S". Este modo admite la calidad variable frente a los niveles de tamaño de archivo (como JPEG), canales alfa, compresión incorporada y matrices de textura opcionalmente comprimidas como una secuencia de video utilizando bloques de omisión (reposición condicional). Este modo se puede transcodificar rápidamente a todos los formatos de textura LDR compatibles.
UASTC LDR: un modo de alta calidad de 8 bits/píxeles LDR. UASTC LDR es un subconjunto de 19 modo del formato de textura ASTC LDR 4x4 (8BPP) estándar, pero con un formato de bloque personalizado que contiene pistas de transcodificación. La transcodificación de UASTC LDR a ASTC LDR y BC7 es particularmente rápido y simple, porque UASTC LDR es un subconjunto común de BC7 y ASTC. Los transcodificadores para los otros formatos de textura se aceleran por varios bits de sugerencias específicos de formato presentes en cada bloque UASTC LDR.
Este modo admite una etapa optimizada optimizada (RDO) postprocesada que condiciona a los datos de textura UASTC LDR codificados en el archivo .ktx2/.Basis para que pueda estar comprimido LZ de manera más efectiva. Más detalles aquí.
Aquí está el documento de especificación UASTC LDR.
Aquí está el documento de especificación HDR de UASTC y algunas imágenes de ejemplo comprimidas.
Los archivos .Basis y .KTX2 admiten niveles de MIPMAP, matrices de textura, cubemas de cubemas de cubemas de cubierta y video de textura, en los tres modos. Además, los archivos .Basis admiten matrices de textura no uniformes, donde cada imagen en el archivo puede tener una resolución o número diferente de niveles de MIPMAP.
En el modo ETC1S, el compresor puede explotar las correlaciones de color y el patrón en todas las imágenes en todo el archivo utilizando libros de códigos de punto final global/selector, por lo que varias imágenes con mipmaps se pueden almacenar de manera eficiente en un solo archivo. El modo ETC1S también admite secuencias de video cortas, con bloques de omisión (reabastecimiento condicional) que se usa para no enviar bloques que no han cambiado en relación con el marco anterior.
Los formatos de imagen LDR compatidos para la lectura son .png, .dds con mipmaps, .tga, .qoi y .jpg. Los formatos de imagen HDR compatidos para la lectura son .exr, .HDR y .dds con mipmaps. Puede escribir .basis, .ktx2, .dds, .ktx (v1), .astc, .out, .exr y .png archivos.
El sistema ahora admite la carga de archivos 2D .DDS básicos con mipmaps opcionales, pero el archivo .dds debe estar en uno de los formatos sin comprimir: 24BPP RGB, 32BPP RGBA/BGRA, RGBA de medio flotador o Float RGBA. El uso de archivos .dds permite al usuario controlar exactamente cómo se generan los mipmaps antes de la compresión.
La biblioteca de codificación y la herramienta de línea de comandos no tienen dependencias de terceros requeridas que aún no estén en el repositorio en sí. El transcoder es un archivo fuente único (en transcoder/basisu_transcoder.cpp
) que no tiene dependencias de terceros.
Construimos y probamos bajo:
En Windows con Visual Studio, puede usar el archivo basisu.sln
incluido. Alternativamente, puede usar CMake para crear nuevos archivos de solución/proyecto VS.
Para construir, primero instale cmake, luego:
cd build
cmake ..
make
Para construir con SSE 4.1 Soporte en sistemas X86/X64 (la codificación es aproximadamente 15-30% más rápido), agregue -DSSE=TRUE
a la línea de comandos CMake. Agregar -DOPENCL=TRUE
to Build con soporte (opcional) OpenCL. Use -DCMAKE_BUILD_TYPE=Debug
para construir la depuración. Para construir ejecutables de 32 bits, agregue -DBUILD_X64=FALSE
.
Después de la construcción, la herramienta de línea de comandos nativa utilizada para crear, validar y transcodificar/desactivar archivos .basis/.ktx2 es bin/basisu
.
La herramienta de línea de comandos incluye algunas pruebas automatizadas de codificación/transcodificación LDR/HDR:
cd ../bin
basisu -test
basisu -test_hdr
Para probar el códec en modo OpenCL (debe tener instalado OpenCl Libs/Headers/Drivers y haber compilado el soporte OpenCL en ejecución de CMake con -DOPENCL=TRUE
):
basisu -test -opencl
basisu -q 255 x.png
basisu -linear x.png
basisu -uastc x.png
basisu x.exr
Tenga en cuenta que el lector .exr que estamos usando es TinyExr, que no admite todos los modos de compresión .exr posibles. Herramientas como ImageMagick se pueden usar para crear archivos .exr que TinyExr puede leer.
Alternativamente, las imágenes LDR (como .png) se pueden comprimir a UASTC HDR especificando -hdr
. Por defecto, las imágenes LDR, cuando se comprimen a UASTC HDR, se convierten primero de SRGB a luz lineal antes de la compresión. Este paso de conversión se puede deshabilitar especificando -hdr_ldr_no_srgb_to_linear
.
Es importante destacar que, para la mejor calidad, debe suministrar bases con imágenes originales de origen sin comprimir . Cualquier otro tipo de compresión con pérdida aplicada antes de base (incluyendo ETC1/BC1-5, BC7, JPEG, etc.) hará que aparezcan artefactos multigeneracionales en las texturas de salida finales.
-fastest
(que es equivalente a -uastc_level 0
) coloca los codificadores UASTC LDR/HDR en sus modos más rápidos (pero de menor calidad).
-slower
coloca los codificadores UASTC LDR/HDR en modos de mayor calidad pero más lentos (equivalente a -uastc_level 3
). El nivel predeterminado es 1, y el más alto es 4 (que es bastante lento).
-q X
, donde x varía de [1,255], controla el nivel de compensación de calidad de modo de archivo ETC1S versus el tamaño del tamaño del archivo. 255 es la más alta calidad, y el valor predeterminado es 128.
-debug
hace que el codificador imprima la información de depuración verbosa interna y orientada al desarrollador.
-stats
para ver varias estadísticas de calidad (PSNR).
-linear
: ETC1S predeterminado a las métricas de SRGB Colorspace, UASTC LDR actualmente siempre usa métricas lineales, y UASTC HDR predeterminado a métricas RGB ponderadas (con 2,3,1 pesos). Si la entrada es un mapa normal, o algún otro tipo de contenido de textura no SRGB (no fotográfico), asegúrese de usarlo -linear
para evitar artefactos innecesarios adicionales. (Las métricas de mapas normales angulares para UASTC LDR/HDR son definitivamente factibles y en nuestra lista de TODO).
Especificar -opencl
habilita el modo OpenCL, que actualmente solo acelera la codificación ETC1S.
El compresor está multiproceso de forma predeterminada, que se puede deshabilitar utilizando la opción de línea de comandos -no_multithreading
. El transcoder actualmente está en un solo rostro, aunque es seguro de hilo (es decir, admite descomprimir múltiples cortes de textura en paralelo).
basisu -uastc -uastc_rdo_l 1.0 -mipmap x.png
-uastc_rdo_l X
controla la configuración de calidad RDO (Optimización de la distorsión de la velocidad). Cuanto más bajo este valor, mayor sea la calidad, pero mayor será el tamaño del archivo comprimido. Los buenos valores para probar son entre .2-3.0. El valor predeterminado es 1.0.
basisu -mipmap -q 200 x.png
Hay varias opciones de MIPMAP para cambiar el kernel del filtro, el espacio de los colores del filtro para los canales RGB (lineal vs. SRGB), la dimensión MIPMAP más pequeña, etc. La herramienta también admite la generación de archivos Cubemperia, matrices de textura 2D/CubeMap, etc. para derivarse El generador automático MIPMAP, puede crear archivos de textura .dds sin comprimir LDR o HDR y alimentarlos al compresor.
basisu -comp_level 2 x.png
En algunas imágenes raras (las de los gradientes de cielo azul se atan), es posible que deba aumentar la configuración ETC1S -comp_level
, que varía de 1,6. Esto controla la cantidad de esfuerzo general que el codificador utiliza para optimizar los libros de códigos ETC1 y el flujo de datos comprimido. Los comp_level más altos son significativamente más lentos.
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
Consulte el texto de ayuda para obtener una lista completa de las opciones de línea de comandos de la herramienta. La herramienta de línea de comandos es solo un envoltorio delgado en la parte superior de la biblioteca del codificador.
Puede usar la herramienta de línea de comando o llamar al transcoder directamente desde el código JavaScript o C/C ++ para descomprimir los archivos .ktx2/.Basis a datos de textura de GPU o datos de imagen sin comprimir. Para desempacar un archivo .ktx2 o.Basis a múltiples archivos .png/.exr/.ktx/.dds:
basisu x.ktx2
Use las opciones -no_ktx
y -etc1_only
/ -format_only
para desempacar a menos archivos.
-info
y -validate
solo mostrarán información del archivo y no emitirán ningún archivo.
Los archivos MIPMapped, CubeMap o Texture escritos .ktx/.dds estarán en una amplia variedad de formatos de textura de GPU comprimidos (PVRTC1 4BPP, etc1-2, BC1-5, BC7, etc.), y hasta nuestro conocimiento hay Desafortunadamente (a partir de 2024) todavía no hay una sola herramienta de visor .ktx o .dds que admita de manera correcta y confiable cada formato de textura de GPU que admitamos. Los archivos BC1-5 y BC7 se pueden ver utilizando el compresonador de AMD, etc1/2 utilizando la herramienta de compresión de textura de Mali y PVRTC1 utilizando PVRtextool de Imagination Tech. RenderDoc tiene un visor de archivos de textura útil para muchos formatos. El buscador Mac OSX admite la vista previa .Exr y .ktx archivos en varios formatos de GPU. El explorador de Windows 11 puede obtener una vista previa de los archivos .dds. El visor en línea OpenHDR es útil para ver archivos de imagen .exr/.hdr.
El directorio 'WebGL' contiene cuatro demostraciones simples de WebGL que usan el transcodificador y el compresor compilado a WASM con Emscripten. Estas demostraciones están en línea aquí. Vea más detalles en el archivo ReadMe aquí.
Tanto el transcodificador como el codificador pueden compilarse utilizando Emscripten a WebAssembly y usarse en la web. Un conjunto de envoltorios de JavaScript al códec, escrito en C ++ con extensiones Emscripten, se encuentra en webgl/transcoding/basis_wrappers.cpp
. El envoltorio de JavaScript admite casi todas las características y modos, incluido el video de textura. Consulte los archivos ReadMe.MD y CMakelists.txt en webgl/transcoder
y webgl/encoder
.
Para construir el transcodificador WASM, después de instalar Emscripten:
cd webgl/transcoder/build
emcmake cmake ..
make
Para construir el codificador WASM:
cd webgl/encoder/build
emcmake cmake ..
make
Hay dos demostraciones web de codificación/transcodificación simples, ubicadas en webgl/ktx2_encode_test
y webgl/texture_test
, que muestran cómo usar las API de Wrappers JavaScript de codificadores y transcoder.
Algunos ejemplos simples que muestran cómo llamar directamente al codificador C ++ y las API de la biblioteca de transcodificadores están en example/examples.cpp
.
Vea el wiki aquí.
Puede descargar e instalar la base universal utilizando el Administrador de dependencia de VCPKG:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install basisu
Los miembros y los contribuyentes comunitarios de Microsoft están actualizados con el puerto universal en VCPKG. Si la versión está desactualizada, cree un problema o extraiga la solicitud en el repositorio de VCPKG. (9/10/2024: el soporte de UASTC HDR aún no está disponible aquí).
Las bibliotecas de transcodificador y codificador de núcleo son Apache 2.0. El transcoder no utiliza bibliotecas o dependencias de terceros. Ver licencia.
La biblioteca del codificador es Apache 2.0, pero utiliza algunos módulos de terceros de código abierto (en 'Coder/3rdParty' y en el directorio 'ZSTD') para cargar .Qoi, .dds, .exr Imágenes, para manejar la compresión de ZSTD, y a Desempaqué los bloques de textura ASTC. Vea las licencias y carpetas.
El repositorio se ha actualizado para cumplir con la herramienta de verificación de licencia de reutilización (https://reuse.software/). Ver el subdirectorio .reuse
.
Visor de archivos de imagen HDR en línea .EXR HDR
Windows HDR + Visor de imágenes WCG: un verdadero visor de imágenes HDR para Windows. Vea también el repositorio de GitHub.
Renderdoc
Compresonador de AMD
DirectXtex de Microsoft
Pvrtextool
Herramienta de compresión de textura de Mali - ahora en desacuerdo
Para obtener más enlaces, documentos y herramientas/bibliotecas útiles, consulte el final de la especificación de textura de UASTC HDR.
Correo electrónico: info @ binomial dot información o contáctenos en Twitter
Aquí está la página Wiki de los patrocinadores.