- Published on
动态创建Texture2D
- Authors

- Name
- 东哥
直接贴代码
UTexture2D* ULibNextBridge::CreateTexture2dAsset_ByPixels(FString TextureName, FString Path, const `TArray<FColor>`& FillPixels,
int32 Width, int32 Height, EPixelFormat PixelFormat, bool sRGB)
{
`TArray<FColor>` Pixels = FillPixels;
//创建非重复的名字
FString UniquePackageName;
FString UniqueAssetName;
FAssetToolsModule& AssetToolsModule = FModuleManager::Get().`LoadModuleChecked<FAssetToolsModule>`("AssetTools");
AssetToolsModule.Get().CreateUniqueAssetName(Path + TextureName, TEXT(""), UniquePackageName, UniqueAssetName);
//创建包
UPackage* Package = CreatePackage( *UniquePackageName);
Package->FullyLoad();
//创建贴图资源
UTexture2D* res = `NewObject<UTexture2D>`(Package, *UniqueAssetName, RF_Public | RF_Standalone | RF_MarkAsRootSet);
res->AddToRoot();
res->SRGB = sRGB;
res->MipGenSettings = TMGS_NoMipmaps;
//创建PlatformData数据
FTexturePlatformData* PlatformData = new FTexturePlatformData();
PlatformData->SizeX = Width;
PlatformData->SizeY = Height;
PlatformData->PixelFormat = PixelFormat;
res->SetPlatformData(PlatformData);
res->UpdateResource();
FTexture2DMipMap* Mip = new FTexture2DMipMap();
res->GetPlatformData()->Mips.Add(Mip);
Mip->SizeX = Width;
Mip->SizeY = Height;
//写入像素数据
Mip->BulkData.Lock(LOCK_READ_WRITE);
uint8* TextureData = static_cast<uint8*>(Mip->BulkData.Realloc(Width * Height * sizeof(FColor)));
FMemory::Memcpy(TextureData, Pixels.GetData(), Width * Height * sizeof(FColor));
Mip->BulkData.Unlock();
res->UpdateResource();
//初始化source数据
res->Source.Init(Width,Height,1, 1, ETextureSourceFormat::TSF_BGRA8, reinterpret_cast<uint8*>(Pixels.GetData()));
res->UpdateResource();
Package->MarkPackageDirty();
//注册资源
FAssetRegistryModule::AssetCreated(res);
//创建LongPackageName, 并保存包
FString PackageFileName = FPackageName::LongPackageNameToFilename(UniquePackageName, FPackageName::GetAssetPackageExtension());
FSavePackageArgs SavePackageArgs;
SavePackageArgs.TopLevelFlags = RF_Public | RF_Standalone;
SavePackageArgs.SaveFlags = SAVE_NoError;
bool bSaved = UPackage::SavePackage(Package,NULL,*PackageFileName,SavePackageArgs);
check(bSaved)
return res;
}