MyBlueprintFunctionLibrary.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Engine/TextureRenderTarget2D.h"
#include "MyBlueprintFunctionLibrary.generated.h"
/**
*
*/
UCLASS()
class ANDROIDPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/**
* 将RenderTarget2D转换为Texture2D
* @param RenderTarget - 要转换的RenderTarget
* @return 转换后的Texture2D,如果转换失败返回nullptr
*/
UFUNCTION(BlueprintCallable, Category = "Texture")
static UTexture2D* ConvertRenderTargetToTexture2D(UTextureRenderTarget2D* RenderTarget);
};
MyBlueprintFunctionLibrary.cpp
#include "MyBlueprintFunctionLibrary.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Engine/Texture2D.h"
#include "RenderUtils.h"
UTexture2D* UMyBlueprintFunctionLibrary::ConvertRenderTargetToTexture2D(UTextureRenderTarget2D* RenderTarget)
{
if (!RenderTarget)
{
return nullptr;
}
// 获取RenderTarget的尺寸
const int32 Width = RenderTarget->SizeX;
const int32 Height = RenderTarget->SizeY;
// 创建新的Texture2D
UTexture2D* NewTexture = UTexture2D::CreateTransient(Width, Height, PF_B8G8R8A8);
if (!NewTexture)
{
return nullptr;
}
// 从RenderTarget读取像素数据
TArray<FColor> SurfData;
FRenderTarget* RenderTargetResource = RenderTarget->GameThread_GetRenderTargetResource();
if (!RenderTargetResource || !RenderTargetResource->ReadPixels(SurfData))
{
return nullptr;
}
// 更新Texture2D的数据
void* TextureData = NewTexture->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(TextureData, SurfData.GetData(), SurfData.Num() * sizeof(FColor));
NewTexture->GetPlatformData()->Mips[0].BulkData.Unlock();
// 更新Texture
NewTexture->UpdateResource();
return NewTexture;
}
注意在Build.cs添加
// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
public class AndroidProject : ModuleRules
{
public AndroidProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"InputCore",
"RenderCore",
"HTTP"
});
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}