通过资源管理器创建的渲染目标

#include "RenderTargetSetterActor.h"
#include "AssetRegistry/AssetRegistryModule.h"
#include "Engine/AssetManager.h"

ARenderTargetSetterActor::ARenderTargetSetterActor()
{
    PrimaryActorTick.bCanEverTick = false;

    SceneCaptureComponent = CreateDefaultSubobject<USceneCaptureComponent2D>(TEXT("SceneCaptureComponent"));
    SceneCaptureComponent->SetupAttachment(RootComponent);
}

void ARenderTargetSetterActor::BeginPlay()
{
    Super::BeginPlay();

    UTextureRenderTarget2D* RenderTarget = LoadRenderTarget();
    if (RenderTarget && SceneCaptureComponent)
    {
        SceneCaptureComponent->TextureTarget = RenderTarget;
    }
}

UTextureRenderTarget2D* ARenderTargetSetterActor::LoadRenderTarget()
{
    if (RenderTargetAssetRef.IsValid())
    {
        UObject* Asset = UAssetManager::GetStreamableManager().LoadSynchronous(RenderTargetAssetRef);
        return Cast<UTextureRenderTarget2D>(Asset);
    }
    return nullptr;
}

 

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Components/SceneCaptureComponent2D.h"
#include "RenderTargetSetterActor.generated.h"

UCLASS()
class YOURPROJECT_API ARenderTargetSetterActor : public AActor
{
    GENERATED_BODY()

public:
    ARenderTargetSetterActor();

protected:
    virtual void BeginPlay() override;

private:
    UPROPERTY(EditAnywhere, Category = "Render Target")
    FStringAssetReference RenderTargetAssetRef;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
    USceneCaptureComponent2D* SceneCaptureComponent;

    UTextureRenderTarget2D* LoadRenderTarget();
};

 

那么每次通过LoadRenderTarget()得到的渲染目标是不是同一个呢?

每次调用LoadRenderTarget()函数,如果RenderTargetAssetRef不变,并且加载过程没有错误,那么得到的是同一个渲染目标实例。
LoadRenderTarget()函数通过UAssetManager根据RenderTargetAssetRef来加载资产。只要RenderTargetAssetRef所引用的渲染目标资产路径不变,UAssetManager会返回相同的UTextureRenderTarget2D实例。因为UAssetManager会缓存已经加载的资产,当再次请求加载相同路径的资产时,它会直接从缓存中返回已加载的实例,而不会重新创建一个新的实例。
不过,如果在调用LoadRenderTarget()函数之前,RenderTargetAssetRef被修改为引用另一个不同的渲染目标资产,那么将会加载并返回一个不同的渲染目标实例。此外,如果资产在加载过程中出现错误,例如资产路径无效或资产被删除等情况,函数将返回nullptr。

可以这样理解。在 UE5 中,通过资源管理器创建的渲染目标是一个具体的对象实例。
这个渲染目标实例具有特定的属性和行为,例如它有自己的分辨率、格式、内存布局等属性,并且可以被场景捕捉组件或其他相关功能所引用和使用,以实现将场景内容渲染到该目标上的功能。就像其他 UE5 中的资产对象一样,它在内存中占据一定的空间,有其独特的身份标识,可通过各种方式进行访问和操作。

 

posted on 2025-03-24 15:47  zxddesk  阅读(32)  评论(0)    收藏  举报

导航