Um sistema de transcodificação de textura compactada portátil LDR/HDR.
O Universal Basal é um sistema de intercâmbio compactado de textura compactada LDR/HDR de código aberto da Binomial LLC que suporta dois formatos de arquivo intermediário: o padrão .ktx2 aberto do grupo Khronos e nosso próprio formato de arquivo ".Basis". Esses formatos de arquivo suportam transcodificação rápida para praticamente qualquer formato de textura GPU compactado lançado nos últimos ~ 25 anos.
Nossa meta geral com este projeto é simplificar a codificação e a distribuição eficiente da textura, imagem e textura de textura por LDR e HDR portáteis de uma maneira que seja compatível com qualquer API de GPU ou renderização/gráfico.
O sistema suporta três modos: etc1s, uastc ldr e uastc hdr. O codificador C/C ++ e os liberes transcodificadores podem ser compilados em código oumbly nativo, e todos os recursos do codificador/transcodificador podem ser acessados a partir do JavaScript.
Notas de liberação
Exemplos de codificador ao vivo/transcoder webgl
Javascript API/WASM/WEBGL Info
Imagens de exemplo hdr uastc
Os arquivos etc1s e uastc ldr podem ser transcodificados para:
Os arquivos HDR UASTC podem ser transcodificados para:
Etc1s: um modo supercompressado de aproximadamente 0,3-3bpp de baixa a média qualidade com base em um subconjunto de etc1 chamado "etc1s". Este modo suporta a qualidade variável versus níveis de tamanho de arquivo (como JPEG), canais alfa, compactação interna e matrizes de textura opcionalmente compactadas como uma sequência de vídeo usando blocos de SKIP (reabastecimento condicional). Este modo pode ser rapidamente transcodificado para todos os formatos de textura LDR suportados.
UASTC LDR: Um modo de alta qualidade de 8 bits/pixels. O UASTC LDR é um subconjunto de 19 modos do formato de textura padrão ASTC LDR 4X4 (8BPP), mas com um formato de bloco personalizado contendo dicas de transcodificação. A transcodificação do UASTC LDR para ASTC LDR e BC7 são particularmente rápidos e simples, porque o UASTC LDR é um subconjunto comum de BC7 e ASTC. Os transcodificadores para os outros formatos de textura são acelerados por vários bits de dica específicos de formato presentes em cada bloco UASTC LDR.
Este modo suporta um estágio pós-processo opcional de distorção de taxa (RDO) que condiciona os dados de textura do UASTC LDR codificados no arquivo .ktx2/.basis para que possa ser mais efetivamente compactado. Mais detalhes aqui.
Aqui está o documento de especificação do UASTC LDR.
Aqui está o documento de especificação do UASTC HDR e algumas imagens de exemplo compactadas.
Os arquivos .BASIS e .KTX2 suportam níveis de MIPMAP, matrizes de textura, mapas de cubemas, matrizes de cubemap e vídeo de textura nos três modos. Além disso, os arquivos .BASIS suportam matrizes de textura não uniformes, onde cada imagem no arquivo pode ter uma resolução ou número diferente de níveis de MIPMAP.
No modo ETC1S, o compressor é capaz de explorar correlações de cores e padrões em todas as imagens em todo o arquivo usando o Global Endpoint/Selector Codebooks; portanto, várias imagens com MIPMAPs podem ser armazenadas com eficiência em um único arquivo. O modo etc1s também suporta sequências de vídeo curtas, com blocos de skip (reabastecimento condicional) usados para não enviar blocos que não foram alterados em relação ao quadro anterior.
Os formatos de imagem LDR suportados para leitura são .png, .dds com mipmaps, .tga, .qoi e .jpg. Os formatos de imagem HDR suportados para leitura são .exr, .hdr e .dds com mipmaps. Ele pode escrever arquivos .BASIS, .KTX2, .DDS, .KTX (V1), .astc, .out, .exr e .png.
O sistema agora suporta os arquivos básicos 2D .DDs com MIPMAPs opcionais, mas o arquivo .dds deve estar em um dos formatos não compactados suportados: 24BPP RGB, 32BPP RGBA/BGRA, RGBA semi-tloat ou Float RGBA. O uso de arquivos .dds permite ao usuário controlar exatamente como os MIPMAPs são gerados antes da compactação.
A biblioteca de codificação e a ferramenta de linha de comando não têm dependências necessárias de terceiros que ainda não estão no próprio repositório. O transcodificador é um único arquivo de origem .cpp (no transcoder/basisu_transcoder.cpp
) que não possui dependências de terceiros.
Nós construímos e testamos em:
Sob Windows com Visual Studio, você pode usar o arquivo basisu.sln
incluído. Como alternativa, você pode usar o CMake para criar novos arquivos de solução/projeto.
Para construir, primeiro instale o cmake e depois:
cd build
cmake ..
make
Para construir com o suporte SSE 4.1 nos sistemas x86/x64 (a codificação é aproximadamente 15-30% mais rápida), adicione -DSSE=TRUE
na linha de comando cmake. Add -DOPENCL=TRUE
a ser construído com suporte (opcional) openCL. Use -DCMAKE_BUILD_TYPE=Debug
para construir no depuração. Para criar executáveis de 32 bits, adicione -DBUILD_X64=FALSE
.
Após a construção, a ferramenta de linha de comando nativa usada para criar, validar e transcodificar/despachar os arquivos .basis/.ktx2 é bin/basisu
.
A ferramenta de linha de comando inclui alguns testes automatizados de codificação/transcodificação LDR/HDR:
cd ../bin
basisu -test
basisu -test_hdr
Para testar o codec no modo OpenCL (deve ter o OpenCl Libs/Headers/Drivers instalado e ter compilado o suporte de OpenCL na execução do CMake com -DOPENCL=TRUE
):
basisu -test -opencl
basisu -q 255 x.png
basisu -linear x.png
basisu -uastc x.png
basisu x.exr
Observe que o leitor .exr que estamos usando é o TinyExr's, que não suporta todos os modos de compactação .exr possíveis. Ferramentas como o ImageMagick podem ser usadas para criar arquivos .exr que o tinyexr pode ler.
Como alternativa, as imagens LDR (como .png) podem ser compactadas ao UASTC HDR especificando -hdr
. Por padrão, as imagens LDR, quando compactadas no UASTC HDR, são convertidas pela primeira vez de SRGB em luz linear antes da compressão. Esta etapa de conversão pode ser desativada especificando -hdr_ldr_no_srgb_to_linear
.
É importante ressaltar que, para a melhor qualidade, você deve fornecer a BaseU com imagens de origem não compactadas originais . Qualquer outro tipo de compactação com perdas aplicada antes do BaseU (incluindo etc1/bc1-5, bc7, jpeg, etc.) fará com que artefatos multigeracionais apareçam nas texturas finais de saída.
-fastest
(que é equivalente a -uastc_level 0
) coloca os codificadores UASTC LDR/HDR em seus modos mais rápidos (mas de qualidade inferior).
-slower
coloca os codificadores UASTC LDR/HDR em modos de maior qualidade, mas mais lentos (equivalentes a -uastc_level 3
). O nível padrão é 1 e o mais alto é 4 (o que é bastante lento).
-q X
, de onde x varia de [1.255], controla o nível de troca de troca do tamanho do modo ETC1S do modo. 255 é a mais alta qualidade e o padrão é 128.
-debug
faz com que o codificador imprima informações internas e orientadas para o desenvolvedor, informações de depuração verbosa.
-stats
para ver várias estatísticas de qualidade (PSNR).
-linear
: etc1s Padrões para as métricas SRGB Colorspace, o UASTC LDR atualmente sempre usa métricas lineares e o UASTC HDR padrão para métricas RGB ponderadas (com 2,3,1 pesos). Se a entrada for um mapa normal ou algum outro tipo de conteúdo de textura não-SRGB (não fotográfico), use-se -linear
para evitar artefatos desnecessários extras. (As métricas de mapa normal angular para UASTC LDR/HDR são definitivamente factíveis e em nossa lista de tarefas.)
A especificação -opencl
permite o modo OpenCL, que atualmente acelera apenas a codificação etc1s.
O compressor é multithread por padrão, que pode ser desativado usando a opção -no_multithreading
de linha de comando. Atualmente, o transcodificador é um único rosqueado, embora seja seguro de thread (ou seja, suporta descomprimir várias fatias de textura em paralelo).
basisu -uastc -uastc_rdo_l 1.0 -mipmap x.png
-uastc_rdo_l X
controla a configuração de qualidade RDO (otimização da distorção de taxa). Quanto menor esse valor, maior a qualidade, mas maior o tamanho do arquivo compactado. Bons valores a serem experimentados estão entre .2-3.0. O padrão é 1.0.
basisu -mipmap -q 200 x.png
Existem várias opções de MIPMAP para alterar o kernel do filtro, o espaço de cores do filtro para os canais RGB (linear vs. SRGB), a menor dimensão MIPMAP, etc. A ferramenta também suporta geração de arquivos Cubemap, matrizes de textura 2D/Cubemap, etc. para contornar O gerador MIPMAP automático, você pode criar arquivos de textura LDR ou HDR não compactados .dds e alimentá -los com o compressor.
basisu -comp_level 2 x.png
Em algumas imagens raras (aquelas com gradientes de céu azul vêm para se vincular), pode ser necessário aumentar a configuração etc1s -comp_level
, que varia de 1,6. Isso controla a quantidade de esforço geral que o codificador usa para otimizar os livros de códigos do etc1s e o fluxo de dados comprimido. O Comp_Level mais alto é significativamente mais lento.
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 o texto de ajuda para obter uma lista completa das opções de linha de comando da ferramenta. A ferramenta de linha de comando é apenas um invólucro fino na parte superior da biblioteca do codificador.
Você pode usar a ferramenta de linha de comando ou chamar o transcodificador diretamente do código JavaScript ou C/C ++ para descomprimir arquivos .ktx2/.basis para dados de textura da GPU ou dados de imagem não compactados. Para descrever um arquivo .ktx2 ou.basis para vários arquivos .png/.exr/.ktx/.dds:
basisu x.ktx2
Use as opções -no_ktx
e -etc1_only
/ -format_only
para descompactar para menos arquivos.
-info
e -validate
apenas exibirão informações de arquivo e não produzirão arquivos.
Os arquivos escritos de MipMaped, Cubemap ou Array de Textura .ktx/.dds estarão em uma ampla variedade de formatos de textura GPU compactados (PVRTC1 4BPP, etc1-2, BC1-5, BC7, etc.), e para nosso conhecimento que existe Infelizmente (a partir de 2024), ainda não há uma ferramenta de visualizador .ktx ou .dds que suporta correta e confiabilidade todos os formatos de textura da GPU que apoiamos. Os arquivos BC1-5 e BC7 são visíveis usando o compressonador da AMD, etc1/2 usando a ferramenta de compactação de textura do Mali e o PVRTC1 usando o PVRTexTool da Imagination Tech. RenderDoc possui um visualizador de arquivo de textura útil para muitos formatos. O Mac OSX Finder suporta arquivos .exr e .ktx em vários formatos GPU. O Windows 11 Explorer pode visualizar arquivos .dds. O Visualizador Online OpenHDR é útil para visualizar arquivos de imagem .exr/.hdr.
O diretório 'webgl' contém quatro demos simples do WebGL que usam o transcodificador e o compressor compilados para o WASM com o EMSCRIPTEN. Essas demos estão online aqui. Veja mais detalhes no arquivo ReadMe aqui.
Tanto o transcodificador quanto o codificador podem ser compilados usando o EMSCRIPTEN para WebAssembly e usados na Web. Um conjunto de invólucros de JavaScript no codec, escrito em C ++ com extensões EMScripten, está localizado em webgl/transcoding/basis_wrappers.cpp
. O invólucro JavaScript suporta quase todos os recursos e modos, incluindo vídeo de textura. Consulte os arquivos readme.md e cmakelists.txt no webgl/transcoder
e webgl/encoder
.
Para construir o transcodificador WASM, depois de instalar o EMSCRIPTEN:
cd webgl/transcoder/build
emcmake cmake ..
make
Para construir o codificador WASM:
cd webgl/encoder/build
emcmake cmake ..
make
Existem duas demonstrações da Web de codificação/transcodificação simples, localizadas em webgl/ktx2_encode_test
e webgl/texture_test
, que mostram como usar os APIs do invólucro JavaScript do codificador e do transcodificador.
Alguns exemplos simples que mostram como chamar diretamente as APIs do codificador C ++ e da biblioteca transcodificadora estão em example/examples.cpp
.
Veja o wiki aqui.
Você pode fazer o download e instalar o Universal BASE usando o gerenciador de dependência VCPKG:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install basisu
O porto universal base no VCPKG é mantido atualizado pelos membros da equipe da Microsoft e pelos colaboradores da comunidade. Se a versão estiver desatualizada, crie uma solicitação de problema ou puxe no repositório VCPKG. (9/10/2024: o suporte do UASTC HDR ainda não está disponível aqui.)
As bibliotecas de transcodificadores e codificadores principais são o Apache 2.0. O transcodificador não utiliza bibliotecas ou dependências de terceiros. Consulte a licença.
A biblioteca do codificador é o Apache 2.0, mas utiliza alguns módulos de terceiros de código aberto (no 'codificador/3rdparty' e no diretório 'zstd') para carregar .qoi, .dds, imagens .exr, para lidar Desembale os blocos de textura ASTC. Veja as licenças e as pastas .Rese.
O repositório foi atualizado para estar em conformidade com a ferramenta de verificação de licença de reutilização (https://reuse.software/). Veja o subdiretório .reuse
.
Visualizador de arquivo de imagem hdr online .exr
Visualizador de imagem Windows HDR + WCG - um verdadeiro visualizador de imagem HDR para Windows. Veja também o repositório do Github.
Renderdoc
Compressonator da AMD
DirectxTex da Microsoft
PvrTexTool
Ferramenta de compressão de textura do Mali - agora depreciada
Para links, papéis e ferramentas/bibliotecas mais úteis, consulte o final da especificação de textura do UASTC HDR.
E-mail: info @ informações de ponto binomial ou entre em contato conosco no Twitter
Aqui está a página do Wiki dos patrocinadores.