How to transfer UTextureRenderTarget2D to CPU memory in C++ ?

:partying_face: :partying_face: Thanks !!! :partying_face: :partying_face:

It was a little more complicated but indeed NewObject effects were inexplicable. I use Kismet API helper to manipulate RenderTarget. (Thanks to this tutorial to show this api Render Targets for Shaders without the Render Target Camera Overhead).

APaysanPawn::APaysanPawn()
{
        ...
        // Allocated capture WITHOUT RenderTarget
        Capture = CreateDefaultSubobject<USceneCaptureComponent2D> (TEXT("SceneCapture"));
	Capture->CaptureSource = SCS_FinalColorLDR;
	Capture->SetupAttachment(CameraBoom);
        ...
}

void APaysanPawn::OnConstruction(const FTransform& Transform)
{
	Super::OnConstruction(Transform);

        // Build RenderTarget
	_textureRender = UKismetRenderingLibrary::CreateRenderTarget2D(GetWorld(), 512, 512, RTF_RGBA8, FColor::Magenta);
	check(_textureRender);
	_textureRender->UpdateResourceImmediate();

        // Set to capture system
	Capture->TextureTarget      = _textureRender;
}

TArray64<uint8> APaysanPawn::dumpCapture() const
{
    check(Capture != nullptr && _textureRender != nullptr);

	_textureRender->UpdateResourceImmediate(false);

    TArray64<uint8> CompressedBitmap;
    FImage image;
    if (FImageUtils::GetRenderTargetImage(_textureRender, image))
    {
        if (!FImageUtils::CompressImage(CompressedBitmap, TEXT("jpg"), image))
        {
            verifyf(false, TEXT("Can't compress render target image to jpg"));
        }
    }
    else
    {
        verifyf(false, TEXT("Can't read render target image"));
    }

    return CompressedBitmap;
}

And the photo finish

2 Likes