1 获取rendertarget数据
// ReadPixelsAsync stats:
// FPS: ~30fps
// Frame: ~30ms
ReadPixelsAsync();
// ReadPixels stats:
// FPS: ~24fps
// Frame: ~40ms
// ReadPixels();
void ACapturePawn::ReadPixels() {
// Get texture render target pixel data
FRenderTarget* RenderTarget =
CaptureComponent->TextureTarget->GameThread_GetRenderTargetResource();
FReadSurfaceDataFlags ReadSurfaceDataFlags;
RenderTarget->ReadPixels (
PixelData,
ReadSurfaceDataFlags,
FIntRect (0, 0, FrameWidth, FrameHeight));
bWaitingOnPixelData = true;
bPixelDataReady = true;
}
void ACapturePawn::ReadPixelsAsync() {
// GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("ReadPixelsAsync Begin"));
FRenderTarget* RenderTarget =
CaptureComponent->TextureTarget->GameThread_GetRenderTargetResource();
FIntRect InRect(0, 0, RenderTarget->GetSizeXY().X, RenderTarget->GetSizeXY().Y);
PixelData.Empty(RenderTarget->GetSizeXY().X * RenderTarget->GetSizeXY().Y);
PixelData.Reset();
FReadSurfaceDataFlags InFlags(RCM_UNorm, CubeFace_MAX);
// Read the render target surface data back.
struct FReadSurfaceContext
{
FRenderTarget* SrcRenderTarget;
TArray<FColor>* OutData;
FIntRect Rect;
FReadSurfaceDataFlags Flags;
bool* bFinishedPtr;
};
FReadSurfaceContext ReadSurfaceContext =
{
RenderTarget,
&PixelData,
InRect,
InFlags,
&bPixelDataReady
};
ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
ReadSurfaceCommand,
FReadSurfaceContext, Context, ReadSurfaceContext,
{
RHICmdList.ReadSurfaceData(
Context.SrcRenderTarget->GetRenderTargetTexture(),
Context.Rect,
*Context.OutData,
Context.Flags
);
*Context.bFinishedPtr = true;
}
);
// GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("ReadPixelsAsync Finish"));
bWaitingOnPixelData = true;
}
2 获取backbuffer
在editer里面 会获取整个窗口
如果想获取单独游戏画面 需要打包或者单独窗口
此块代码可以参考 pixel streaming插件
3 获取Fviewport
代码参考 UMediaCapture::CaptureSceneViewport 里面逻辑
在PlayInEditorViewportActive模式下 viewport无法输出widget上的东西
在si’mulate下面 获取不到viewport
单独窗口和打包和backbuffer效果一样