I attempted to create a new texture array in C++ and add textures to it, but after saving, the texture array asset appears black. It only displays correctly after manually modifying parameters in the editor to trigger a recompile.
this is create result
after i change sourcetexture
UTexture2DArray* NewTexture = CreateTransientArrayWithMips(TextureSize, Texture2DArray.Num(), PixelFormat, SRGB, RF_Public | RF_Standalone, *Name, Package);
NewTexture->MipGenSettings = TMGS_FromTextureGroup;
if (PixelFormat == PF_BC7)
{
NewTexture->CompressionSettings = TC_BC7;
}
else if (PixelFormat == PF_R16F)
{
NewTexture->CompressionSettings = TC_HalfFloat;
}
for (auto Texture : Texture2DArray)
{
NewTexture->SourceTextures.Add(Texture);
}
NewTexture->MaxTextureSize = TextureSize;
NewTexture->UpdateSourceFromSourceTextures(false);
NewTexture->UpdateResource();
FAssetRegistryModule::AssetCreated(NewTexture);
FString PackageFileName = FPackageName::LongPackageNameToFilename(FullPackagePath, FPackageName::GetAssetPackageExtension());
FSavePackageArgs SaveArgs;
SaveArgs.TopLevelFlags = RF_Public | RF_Standalone;
SaveArgs.Error = GLog;
SaveArgs.bForceByteSwapping = false;
SaveArgs.SaveFlags = SAVE_NoError;
GEditor->SavePackage(Package, NewTexture, *PackageFileName, SaveArgs);
UTexture2DArray* CreateTransientArrayWithMips(int32 InSize, int32 InCapacity, EPixelFormat Format, bool bSRGB, EObjectFlags Flags, FName name = NAME_None,
UPackage* Package = GetTransientPackage())
{
UTexture2DArray* NewTexture = nullptr;
if (InSize > 0 && InSize > 0 && InCapacity > 0 &&
(InSize % GPixelFormats[Format].BlockSizeX) == 0 &&
(InSize % GPixelFormats[Format].BlockSizeY) == 0)
{
NewTexture = NewObject<UTexture2DArray>(
Package,
name,
Flags
);
NewTexture->SetPlatformData(new FTexturePlatformData());
NewTexture->GetPlatformData()->SizeX = InSize;
NewTexture->GetPlatformData()->SizeY = InSize;
NewTexture->GetPlatformData()->SetNumSlices(InCapacity);
NewTexture->GetPlatformData()->PixelFormat = Format;
NewTexture->bNotOfflineProcessed = true;
// Allocate first mipmap.
int32 NumBlocksX = InSize / GPixelFormats[Format].BlockSizeX;
int32 NumBlocksY = InSize / GPixelFormats[Format].BlockSizeY;
FTexture2DMipMap* Mip = new FTexture2DMipMap(InSize, InSize, InCapacity);
NewTexture->GetPlatformData()->Mips.Add(Mip);
Mip->BulkData.Lock(LOCK_READ_WRITE);
Mip->BulkData.Realloc((int64)GPixelFormats[Format].BlockBytes * NumBlocksX * NumBlocksY * InCapacity);
Mip->BulkData.Unlock();
}
else
{
UE_LOG(LogTexture, Warning, TEXT("Invalid parameters specified for UTexture2DArray::CreateTransient()"));
}
if (!NewTexture) return nullptr;
FTexturePlatformData* PD = NewTexture->GetPlatformData();
int32 MipSizeX = InSize >> 1;
int32 MipSizeY = InSize >> 1;
while (MipSizeX > 0 && MipSizeY > 0)
{
int32 NumBlocksX = FMath::Max(1, MipSizeX / (int32)GPixelFormats[Format].BlockSizeX);
int32 NumBlocksY = FMath::Max(1, MipSizeY / (int32)GPixelFormats[Format].BlockSizeY);
FTexture2DMipMap* Mip = new FTexture2DMipMap(MipSizeX, MipSizeY, InCapacity);
PD->Mips.Add(Mip);
Mip->BulkData.Lock(LOCK_READ_WRITE);
int64 TotalByteSize = (int64)GPixelFormats[Format].BlockBytes * NumBlocksX * NumBlocksY * InCapacity;
FMemory::Memzero(Mip->BulkData.Realloc(TotalByteSize), TotalByteSize);
Mip->BulkData.Unlock();
if (MipSizeX == 1 && MipSizeY == 1) break;
MipSizeX = FMath::Max(1, MipSizeX >> 1);
MipSizeY = FMath::Max(1, MipSizeY >> 1);
}
NewTexture->SRGB = bSRGB;
NewTexture->NeverStream = false;
NewTexture->UpdateResource();
return NewTexture;
}

