UE4 Runtime下導入IES貼圖爲TextureLightProfile

編輯器下導入需要用到IESLoadHelper,此類在IESLoader.h中 先拷貝IESLoader.h和IESLoader.cpp到自己目錄

主函數:

UTextureLightProfile* XXX::func(const FString& FullFilePath)
{
	TArray<uint8> Result;
    //導入數據
	if (!FFileHelper::LoadFileToArray(Result, *FullFilePath)) return nullptr;
    
    //使用LoadHelper類解析數據
	uint8* Buffer = &Result[0];
	int32 Length;
	Length = Result.Num();
	FIESLoadHelper IESLoadHelper(Buffer, Length);

	if (IESLoadHelper.IsValid())
	{
		TArray<uint8> RAWData;
		float Multiplier = IESLoadHelper.ExtractInRGBA16F(RAWData);
		UTextureLightProfile* Texture = NewObject<UTextureLightProfile>();
        
        //編輯器下使用Source.Init()函數,但不能Runtime下使用
		//if (Texture)
		//{
		//	Texture->Source.Init(
		//		IESLoadHelper.GetWidth(),
		//		IESLoadHelper.GetHeight(),
		//		/*NumSlices=*/ 1,
		//		1,
		//		TSF_RGBA16F,
		//		RAWData.GetData()
		//	);

		//	Texture->AddressX = TA_Clamp;
		//	Texture->AddressY = TA_Clamp;
		//	Texture->CompressionSettings = TC_HDR;
		//	Texture->Brightness = IESLoadHelper.GetBrightness();
		//	Texture->TextureMultiplier = Multiplier;

		//	Texture->UpdateResource();
		//}
		//return Texture;
        
        //仿照UTexture2D::CreateTransient()流程,在BulkData.Lock時寫入數據
		if (Texture&&RAWData.GetData())
		{
			EPixelFormat InPixelFormat = EPixelFormat::PF_FloatRGBA;
			/* Create transient texture */
			Texture->PlatformData = new FTexturePlatformData();
			Texture->PlatformData->SizeX = IESLoadHelper.GetWidth();
			Texture->PlatformData->SizeY = IESLoadHelper.GetHeight();
			Texture->PlatformData->PixelFormat = InPixelFormat;

			// Allocate first mipmap.
			int32 NumBlocksX = IESLoadHelper.GetWidth() / GPixelFormats[InPixelFormat].BlockSizeX;
			int32 NumBlocksY = IESLoadHelper.GetHeight() / GPixelFormats[InPixelFormat].BlockSizeY;
			FTexture2DMipMap* Mip = new(Texture->PlatformData->Mips) FTexture2DMipMap();
			Mip->SizeX = IESLoadHelper.GetWidth();
			Mip->SizeY = IESLoadHelper.GetHeight();
			int32 TotalBytes = NumBlocksX * NumBlocksY * GPixelFormats[InPixelFormat].BlockBytes;
               
            //鎖死,寫入數據
			Mip->BulkData.Lock(LOCK_READ_WRITE);
			uint8* DestData = (uint8*)Mip->BulkData.Realloc(TotalBytes);
			FMemory::Memcpy(DestData, RAWData.GetData(), TotalBytes);
			Mip->BulkData.Unlock();

			if (!Texture) return NULL;
			Texture->PlatformData->NumSlices = 1;
			Texture->NeverStream = true;

			Texture->AddressX = TA_Clamp;
			Texture->AddressY = TA_Clamp;
			Texture->CompressionSettings = TC_HDR;
			Texture->Brightness = IESLoadHelper.GetBrightness();
			Texture->TextureMultiplier = Multiplier;

			Texture->UpdateResource();
		}
		return Texture;
	}
	return nullptr;

}

其他類型貼圖也能參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章