将JPG,PNG图像转为ktx2

190 篇文章 38 订阅

根据官方网站 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, &params);// 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, &params);
		}

		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 File Format Specification

KTX相关资料:

3D-Formats-Guidelines/KTXArtistGuide.md at main · KhronosGroup/3D-Formats-Guidelines · GitHub
https://github.com/KhronosGroup/DataFormat

将JPG,PNG图像转为ktx2

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值