我是写在函数库里
.h
UFUNCTION(BlueprintCallable)
static UTexture2D* RenderWidgetToTexture(UUserWidget* Widget, int32 Width, int32 Height);
.cpp
UTexture2D* UMyBlueprintFunctionLibrary::RenderWidgetToTexture(UUserWidget* Widget, int32 Width, int32 Height)
{
if (!Widget)
{
return nullptr;
}
// 创建一个新的RenderTarget
UTextureRenderTarget2D* RenderTarget = NewObject<UTextureRenderTarget2D>();
RenderTarget->InitAutoFormat(Width, Height);
RenderTarget->UpdateResourceImmediate(true);
// 创建一个新的WidgetRenderer
FWidgetRenderer WidgetRenderer(true);
WidgetRenderer.DrawWidget(RenderTarget, Widget->TakeWidget(), FVector2D(Width, Height), 0.0f);
// 从RenderTarget中读取像素并创建Texture2D
FTextureRenderTargetResource* RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource();
TArray<FColor> Bitmap;
RenderTargetResource->ReadPixels(Bitmap);
UTexture2D* Texture = UTexture2D::CreateTransient(Width, Height);
if (!Texture)
{
return nullptr;
}
void* TextureData = Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(TextureData, Bitmap.GetData(), Bitmap.Num() * sizeof(FColor));
Texture->PlatformData->Mips[0].BulkData.Unlock();
Texture->UpdateResource();
return Texture;
}