How to properly render `USceneCaptureComponent2D` in UE5 (C++)

Dear Unreal Community, I am not a UE Game developer but I am using UE+AirSIm to generate images for computer vision tasks, which was working fine in UE4, yet after migrating to UE5 I noticed that the image rendered are not properly lumined.


The main window is the UE5 Arch project and everything looks fine. Yet the middle subwindow is the captureed image, which you can see werid black stains as a result of some improper rendering. Since there are no more documentation of render targets in UE5 I suspect this is not the correct way of image capture/rendering. Any help advice will be welcomed.

UnrealImageCapture.cpp:

#include "UnrealImageCapture.h"
// ... Other includes ...

void UnrealImageCapture::getSceneCaptureImage(APIPCamera* camera, ImageResponse& response) {
    UTextureRenderTarget2D* textureTarget = camera->getCaptureComponent(ImageType::Scene, false)->TextureTarget;
    USceneCaptureComponent2D* capture = camera->getCaptureComponent(ImageType::Scene, false);

    std::shared_ptr<RenderRequest::RenderParams> render_params = 
        std::make_shared<RenderRequest::RenderParams>(capture, textureTarget);
    std::shared_ptr<RenderRequest::RenderResult> render_result = 
        std::make_shared<RenderRequest::RenderResult>();

    RenderRequest render_request{ camera->GetWorld()->GetGameViewport() };
    render_request.getScreenshot(render_params, render_result);
    // Process render_result ...
}

RenderRequest.h:

#pragma once
#include "CoreMinimal.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Components/SceneCaptureComponent2D.h"

class RenderRequest : public FRenderCommand {
public:
    struct RenderParams {
        USceneCaptureComponent2D* const render_component;
        UTextureRenderTarget2D* render_target;
        // ... Other parameters ...
    };

    struct RenderResult {
        // ... Result storage ...
    };

    // ... Other members and methods ...

    void getScreenshot(std::shared_ptr<RenderParams> params, std::shared_ptr<RenderResult>& result);
    // ... Other methods ...
};

RenderRequest::getScreenshot Original Github code

    void getScreenshot(std::shared_ptr<RenderParams> params, std::shared_ptr<RenderResult>& result) {
        // Access the render target resource
        FTextureRenderTargetResource* rt_resource = params->render_target->GetRenderTargetResource();
        FIntPoint img_size = rt_resource->GetSizeXY();
        result->width = img_size.X;
        result->height = img_size.Y;

        // Read pixels based on the specified format
        if (!params->pixels_as_float) {
            // Reading 8-bit per channel format
            rt_resource->ReadPixels(result->image_data_uint8);
        } else {
            // Reading floating-point data
            rt_resource->ReadFloat16Pixels(result->image_data_float);
        }
    }
};