根据官方网站 GitHub - KhronosGroup/KTX-Software: KTX (Khronos Texture) Library and Tools
ktx2库依赖了一堆奇奇怪怪得汇编等东西, 不适合封装成跨平台得库, 遂自行将源码抽出封装成库, 先说其他图片转为ktx2得流程:
首先将jpg或者png等其他格式用相应得库读成内存像素;
再选择ktx2得编码范式: 主要有两种可选:(Basis和Astc) 其中(Basis内又分为使用 uastc与否)
具体调用选ETC1S或者 uastc使用ktxTexture2_CompressBasisEx
选astc使用ktxTexture2_CompressAstcEx
最后是否用zstd压缩(Basis不使用uastc将zstd调用失败),输出成文件;
调用代码如下:
ktxTexture* ktx2;
//ktx_error_code_e err;
ktx_error_code_e result;
ktxTextureCreateInfo createInfo;
//createInfo.glInternalformat = 32856;//GL_RGB8; // Ignored if creating a ktxTexture2.
createInfo.vkFormat = ToKtx2VkFormat(img->RGBAType());//VK_FORMAT_R8G8B8_UNORM; // Ignored if creating a ktxTexture1.
createInfo.baseWidth = img->Width();
createInfo.baseHeight = img->Height();
createInfo.baseDepth = 1;
createInfo.numDimensions = 2;
createInfo.numLevels = 1;//log2(max_dim) + 1;
createInfo.numLayers = 1;
createInfo.numFaces = 1;
createInfo.isArray = KTX_FALSE;
createInfo.generateMipmaps = KTX_FALSE;
result = ktxTexture2_Create(&createInfo, ktxTextureCreateStorageEnum::KTX_TEXTURE_CREATE_ALLOC_STORAGE, (ktxTexture2**)&ktx2);
result = ktxTexture_SetImageFromMemory(ktx2, 0, 0, 0, (ktx_uint8_t*)img->Bit(), ktx2->dataSize);
if (KTX_SUCCESS != result)
{
GS_E << " failed to create ktxTexture2; " << ktxErrorString(result);
return false;
}
int threadcount = std::thread::hardware_concurrency() / 4;
if (threadcount <= 0)
threadcount = 1;
if (1 >= m_CompressType)
{
ktxBasisParams params = {};
params.structSize = sizeof(params);
params.threadCount = threadcount;
params.uastc = m_CompressType;//0 默认ETC1S/BLZ 1 uastc
params.compressionLevel = KTX_ETC1S_DEFAULT_COMPRESSION_LEVEL;
params.qualityLevel = m_QualityLevel;
result = ktxTexture2_CompressBasisEx((ktxTexture2*)ktx2, ¶ms);// ktx_uint32_t(m_QualityLevel / 12));
}
else
{
ktxAstcParams params{};
params.structSize = sizeof(params);
params.threadCount = threadcount;
params.blockDimension = KTX_PACK_ASTC_BLOCK_DIMENSION_6x6;
params.mode = KTX_PACK_ASTC_ENCODER_MODE_LDR;
params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM;
params.normalMap = false;
if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST)
params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_FASTEST;
if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_FAST)
params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_FAST;
if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM)
params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_MEDIUM;
if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH)
params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_THOROUGH;
if (m_QualityLevel >= KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE)
params.qualityLevel = KTX_PACK_ASTC_QUALITY_LEVEL_EXHAUSTIVE;
result = ktxTexture2_CompressAstcEx((ktxTexture2*)ktx2, ¶ms);
}
if (m_DeflateUseZstd)
{
result = ktxTexture2_DeflateZstd((ktxTexture2*)ktx2, ktx_uint32_t(m_QualityLevel / 12));
}
if (KTX_SUCCESS != result)
{
GS_E << " failed to deFlate ktxTexture2; " << ktxErrorString(result);
return false;
}
if (m_Buffer) {
m_Buffer->Allocate(0);
ktx_uint8_t* pHead = nullptr;
ktx_size_t size =0;
ktxTexture_WriteToMemory(ktx2, &pHead, &size);
m_Buffer->Append(pHead, size);
}
else {
ktxTexture_WriteToNamedFile(ktx2, m_file.c_str());
}
return true;
做了多年开发, 但是图像解析库各有千秋, 特别是设计到三维得图片纹理编解码其实乱得很,遂将所有库整理为一套库,供大家使用, 图像编解码库封装库(PNG,JPG,WEBP,KTX1和2,tif,SVG) 基本上所有常见类型得库都可以支持, 但是没有封装统一操作, 可以直接嵌入代码即可.
KTX2标准定义:
KTX相关资料:
3D-Formats-Guidelines/KTXArtistGuide.md at main · KhronosGroup/3D-Formats-Guidelines · GitHub
https://github.com/KhronosGroup/DataFormat