Ok, i made it work SOMEHOW.
.h file:
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "UnrealClient.h"
#include "RQ_GameViewportClient.generated.h"
/**
*
*/
UCLASS()
class SCENARIOSYSTEM_API URQ_GameViewportClient : public UGameViewportClient
{
GENERATED_BODY()
public:
virtual void Draw(FViewport* InViewport, FCanvas* Canvas) override;
void CopyViewportToRenderTarget(UTextureRenderTarget2D* RenderTarget);
UPROPERTY()
UTextureRenderTarget2D* MyRenderTarget;
bool PendingCopyViewportToRenderTarget;
void CopyTextureRHI(FRenderTarget* MyViewRenderTarget, UTextureRenderTarget2D* DestRenderTarget);
};
and .cpp file:
#include "Core/RQ_GameViewportClient.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Slate/SceneViewport.h"
void URQ_GameViewportClient::Draw(FViewport* InViewport, FCanvas* Canvas)
{
Super::Draw(Viewport, Canvas);
if (InViewport && PendingCopyViewportToRenderTarget)
{
CopyTextureRHI(InViewport, MyRenderTarget);
}
}
void URQ_GameViewportClient::CopyViewportToRenderTarget(UTextureRenderTarget2D* RenderTarget)
{
MyRenderTarget = RenderTarget;
PendingCopyViewportToRenderTarget = true;
}
void URQ_GameViewportClient::CopyTextureRHI(FRenderTarget* MyViewRenderTarget, UTextureRenderTarget2D* DestRenderTarget)
{
ENQUEUE_RENDER_COMMAND(CopyToResolveTarget)(
[MyViewRenderTarget, DestRenderTarget](FRHICommandListImmediate& RHICmdList)
{
FTexture2DRHIRef destTexture = DestRenderTarget->GetRenderTargetResource()->GetRenderTargetTexture();
FResolveParams ResolveParams;
RHICmdList.CopyToResolveTarget(MyViewRenderTarget->GetRenderTargetTexture(), destTexture, ResolveParams);
});
FlushRenderingCommands();
}
This this custom viewoirt client, so don’t forget to tell UE5 to use it in DefaultEngine.ini:
[/Script/Engine.Engine]
GameViewportClientClassName=/Script/ScenarioSystem.RQ_GameViewportClient
RenderTarget2D is using RTF_RGB10A2 pixel format