专家你好,,
我想要使用C++代码旋转加载进来的贴图90度,请问是否有API或者工具类可以使用?
我自己写的代码队友的贴图资源不工作:
void FAssetManager::RotateTexture(UTexture2D* Texture)
{
if (!Texture)
{
return;
}
int32 numMips = Texture->PlatformData->Mips.Num();
for (int32 MipIndex = 0; MipIndex < numMips; MipIndex++)
{
FTexture2DMipMap& Mip = Texture->PlatformData->Mips[MipIndex];
int32 NumBlocksX = Mip.SizeX / GPixelFormats[Texture->PlatformData->PixelFormat].BlockSizeX;
int32 NumBlocksY = Mip.SizeY / GPixelFormats[Texture->PlatformData->PixelFormat].BlockSizeY;
//get data
const FPixelFormatInfo& pixelFormatInfo = GPixelFormats[Texture->PlatformData->PixelFormat];
int32 bytesPerPixel = pixelFormatInfo.BlockBytes / (pixelFormatInfo.BlockSizeX * pixelFormatInfo.BlockSizeY);
uint8* data = static_cast<uint8*>(Mip.BulkData.Lock(LOCK_READ_WRITE));
if (data == nullptr)
{
Mip.BulkData.Unlock();
continue;
}
TArray<uint8> OrigData(data, NumBlocksX * NumBlocksY * GPixelFormats[Texture->PlatformData->PixelFormat].BlockBytes);
//rotate
for (int32 WidthIndex = 0; WidthIndex < Mip.SizeX; WidthIndex++)
{
for (int32 HeightIndex = 0; HeightIndex < Mip.SizeY; HeightIndex++)
{
int32 OriginalIndex = (WidthIndex + HeightIndex * Mip.SizeX)*bytesPerPixel;
int32 AfterIndex = (HeightIndex + (Mip.SizeX - 1 - WidthIndex) * Mip.SizeY)*bytesPerPixel;
if (OriginalIndex + bytesPerPixel> OrigData.Num() || AfterIndex + bytesPerPixel > OrigData.Num())
{
int32 test = 0;
test++;
UE_LOG(LogTemp, Warning, TEXT("Start to load asset"));
}
else{
memcpy(data + AfterIndex, &OrigData[OriginalIndex], bytesPerPixel);
}
}
}
//int32 temp = Mip.SizeX;
//Mip.SizeX = Mip.SizeY;
//Mip.SizeY = temp;
Mip.BulkData.Unlock();
}
int32 temp = Texture->PlatformData->SizeX;
Texture->PlatformData->SizeX = Texture->PlatformData->SizeY;
Texture->PlatformData->SizeY = temp;
Texture->UpdateResource();
}