58.

UE5 SceneCapture2Dで画像を取得・保存|Render Targetへの出力

編集
この記事の要点
  • SceneCapture2D Actor + Render Target アセットで別カメラからの画像をテクスチャ化
  • ファイル保存は UKismetRenderingLibrary::ExportRenderTarget で .png / .hdr / .exr
  • 一回限りの撮影なら Capture Every Frame = false + CaptureScene() 手動呼び出し
  • Capture Source で Final Color (LDR/HDR) / Scene Depth / Custom Depth など出力内容を選択
  • 実行時 1 フレームのスクショなら HighResShot コンソールコマンドが最速

SceneCapture2D とは

SceneCapture2D はワールド内の任意の位置に仮想カメラを置き、その映像を Texture2D として取得するための Actor です。プレイヤーから見える映像 (PlayerController のカメラ) とは別経路で画を作るため、以下のような用途で使われます:

  • ミニマップ(真上から見下ろした画像を UI に表示)
  • 監視カメラ / セキュリティモニタ(別の場所のカメラ映像を画面内 TV に映す)
  • ポートレート / プロフィール画像生成
  • Screen Shot 保存(プレイヤーカメラとは独立の高解像度撮影)
  • Reflection 用テクスチャ(簡易な鏡)

基本セットアップ

手順1: Render Target を作る

コンテンツブラウザを右クリック → Materials & Textures > Render Target を作成(例: RT_Camera)。Inspector で解像度(512 / 1024 / 2048 など)と RTFormat を指定:

RTFormat用途
RTF_RGBA8通常用途、8bit / channel
RTF_RGBA16fHDR、16bit float
RTF_RGBA32f科学計算用、32bit float
RTF_R8 / R16f単色用途(マスク等)

手順2: SceneCapture2D Actor を配置

Place Actors パネル → SceneCapture2D をシーンにドラッグ。Detail パネルから:

  • Texture Target = 作成した RT_Camera をセット
  • Capture Source = 用途に応じて選択(後述)
  • Capture Every Frame = 常時更新するか
  • Capture On Movement = 動いた時のみ更新

Capture Source の選択肢

Capture Source内容
Final Color (LDR) in RGB最終ポストプロセス込みの通常画像
Final Color (HDR) in LinearHDR、ガンマ補正前
Scene Depth in R深度値のみ
Device Depth in R非線形デプス
Normal in RGB (DWorld Space)ワールド法線
BaseColor in RGBマテリアルベースカラーだけ
Custom Depth in RCustom Depth 設定済オブジェクト
Custom Stencil in RCustom Stencil 値

Material で Render Target を表示

取得した画像を画面内 TV や UI に映すには、Render Target をテクスチャとして参照する Material を作ります:

[Material - M_MonitorScreen]
Texture Sample
  Texture = RT_Camera
  → BaseColor or Emissive Color

UI で使う場合:
  UMG の Image > Brush > Image = RT_Camera を直接指定

1 回限りの撮影とファイル保存

常時キャプチャは負荷が高いので、写真撮影のように1 フレームだけ撮ってファイル保存する例:

#include "Kismet/KismetRenderingLibrary.h"
#include "Components/SceneCaptureComponent2D.h"
#include "Engine/TextureRenderTarget2D.h"

void AMyActor::TakeScreenshot()
{
    // 1. SceneCapture2D 取得
    if (!CaptureActor || !RenderTarget) return;

    USceneCaptureComponent2D* CaptureComp =
        CaptureActor->GetCaptureComponent2D();

    // 2. キャプチャ
    CaptureComp->bCaptureEveryFrame = false;
    CaptureComp->TextureTarget = RenderTarget;
    CaptureComp->CaptureScene();

    // 3. ファイル保存 (.png)
    FString FilePath = FPaths::ProjectSavedDir() / TEXT("Screenshots");
    FString FileName = TEXT("Capture.png");
    UKismetRenderingLibrary::ExportRenderTarget(
        GetWorld(), RenderTarget, FilePath, FileName);
}

Blueprint 版

[Event Take Screenshot]
1. Set bCaptureEveryFrame (false) → SceneCapture2D
2. Capture Scene                  → SceneCapture2D の関数呼び出し
3. Export Render Target           → Render Target, FilePath, FileName を指定

用途別ベストプラクティス

ミニマップ

  • Capture Every Frame = true(プレイヤー移動に追従)
  • Projection Type = Orthographic(透視ではなく平行投影)
  • Ortho Width で表示範囲調整
  • Show Only Actor List で UI に出したいオブジェクトだけに限定
  • Post Process でアウトライン強調

監視カメラ TV

  • Capture Every Frame = true
  • 低解像度(256x256 程度)で性能確保
  • カメラに小さなノイズマテリアルを重ねるとリアル

キャラ立ち絵 / プロフィール

  • Capture Every Frame = false(一度だけ)
  • 専用シーンに置いたキャラのみキャプチャ
  • 背景は黒一色 or 透過用マスク

高解像度スクショ: HighResShot コマンド

ゲーム内で SceneCapture2D を使わずにプレイヤーカメラ視点の高解像度スクリーンショットを撮りたい場合は、コンソールコマンドが手軽です:

// プレイ中にチルダキー (~) でコンソール
HighResShot 4
// → 4 倍解像度 (4K 等)

HighResShot 3840x2160
// → 解像度直接指定

// 保存先: ProjectSaved/Screenshots/[Platform]/

透過 PNG として保存

背景透過の PNG が欲しい場合は、Capture Source を Final Color (LDR) with Alpha 等にしつつ、Render Target を RTF_RGBA8 + Clear Color にアルファ 0 を指定します:

// 背景透過設定
CaptureComp->bUseCustomProjectionMatrix = false;
CaptureComp->CaptureSource =
    ESceneCaptureSource::SCS_FinalColorLDR;
CaptureComp->bAlwaysPersistRenderingState = true;

RenderTarget->ClearColor = FLinearColor(0, 0, 0, 0);
RenderTarget->bForceLinearGamma = false;

パフォーマンスとコスト

  • SceneCapture2D は事実上もう一個カメラを増やすに等しい → GPU 負荷大
  • 不要な間は Capture Every Frame OFF
  • 解像度を必要最小限に
  • Capture Source = Final Color は最も重い(全ポストプロセス計算)
  • Scene Depth 等の単純出力は比較的軽い
  • Show Only Actor List で対象を絞ると軽くなる

Stereo Capture(VR)

VR 用に左右眼を別個にキャプチャしたい場合は SceneCaptureCube 系か StereoLayer + 2 つの SceneCapture2D。HDR 360 度キャプチャなら SceneCaptureCube

FAQ

Q: Render Target が真っ黒
A: ① Texture Target が未セット、② Capture Every Frame が false で CaptureScene() を呼んでいない、③ Show Only Actors リストに何も入っていない、④ シーン側の Show Flag が無効 を確認。

Q: 保存ファイルが上書きされる
A: ExportRenderTarget の FileName にタイムスタンプを加える。FDateTime::Now().ToString() を使うと良いです。

Q: PNG ではなく JPG で保存したい
A: FImageUtils::CompressImageArrayIImageWrapperModule 経由で JPEG エンコードします。SaveImage 系プラグインを使うのが簡単です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 床の上に乗ったらイベントを発生させる方法
  2. OverlapAllDynamicとOverlapAllの違い
  3. タイトル画面を作る方法
  4. サードパーソンテンプレートでのキャラクター表示の仕組みと非表示にする方法
  5. ボタンに文字を記載する方法
  6. Event ActorBeginOverlapとOn Component Begin Overlapの違い
  7. キャラクターに特定のオブジェクトとの当たり判定を付ける
  8. 特定のオブジェクトに触れたとき、キャラクターが倒れるようにする
  9. 動いているオブジェクトに静止しているキャラクターが当たり判定を持たない原因と解決方法
  10. 「On Component Hit」に「Cast To ~」で複数のクラスを指定する方法
  11. Blenderファイルをインポートする方法
  12. 鏡を作成する方法
  13. レベルブループリントでキャラクターの出現を設定する方法
  14. サードパーソンテンプレートにおけるキャラクター出現の定義
  15. アイテムに近づいたらボタンを押してイベントを発火させる方法
  16. 画面の中央にメッセージを表示する方法
  17. どこからでも呼び出せるカスタムイベントを作成する方法
  18. カスタムイベントに引数を追加する方法
  19. 「Get Overlapping Actors」から特定のクラスの場合のみ処理を実行する方法
  20. オブジェクトに近づいている間だけメッセージを表示する方法
  21. PCの画面を操作するUIを作る方法
  22. コンテンツブラウザに画像を追加する方法
  23. SetInputMode_UIOnlyを取り消す方法
  24. 特定の画像の上にマウスカーソルを置いたら手マークにする方法
  25. オブジェクトがアウトライナーで選択できない原因と解決策
  26. PlayerStartを作成する方法
  27. メニュー画面を作成して開く方法
  28. 「Esc」キーを押してメニュー画面を開く方法
  29. イベントの「On Clicked」と「On Pressed」の違い
  30. 「Set Input Mode」の種類と使い方
  31. 「Set Game Paused」の使い方と詳細解説
  32. Motion Matchingとは?
  33. 「GameMode」と「GameModeBase」の違い
  34. マップに配置したTargetPointを取得する方法
  35. TargetPointにタグをつけて取得する方法
  36. Spawnしたインスタンスがイベントを実行する方法
  37. 特定の時間ごとに処理を実行する方法
  38. 数値をランダムで出力する方法
  39. ThirdPersonテンプレートでキャラクターの移動を歩くように変更する方法
  40. MaxWalkSpeedを変更する方法
  41. しゃがむ動作を導入する方法
  42. キャラクターのアニメーションを設定する方法
  43. 導入済みのプラグインを確認する方法
  44. Motion Matchingの導入と必要なプラグイン
  45. プレイヤーを非表示にする方法
  46. カメラを傾ける角度を制限させる方法
  47. 配列からランダムに重ならない要素を特定の数取得する方法
  48. カメラの映す画面に文字やエフェクトを付ける方法
  49. キャラクターやメッシュを非表示にした際にカメラが移動しなくなる問題の解決方法
  50. プライマリーデータアセットを活用する方法
  51. プレイヤーのHPといった変数を定義する最適な場所
  52. カメラに映った画面をスクリーンショットとして保存する方法
  53. ゲーム内のカメラ映像を保存して再表示する方法
  54. HighResShot を使って高解像度の画像を保存する方法(UE5)
  55. HighResShotで保存した画像のファイル名を取得する方法
  56. SceneCapture2DとFrameGrabberの画像保存方法の比較
  57. SceneCapture2Dを使用して画像を保存・取得する方法
  58. HighResShotとTake High Res Screenshotの違い
  59. ゲーム終了ボタンを作成する方法
  60. 「Save Game To Slot」の戻り値がfalseになる問題の解決方法
  61. 画面上にメッセージを指定された時間表示させる方法
  62. シェーダコンパイル時間を短縮する方法
  63. 「Take High Res Screenshot」実行時に「シェーダをコンパイル」に長時間待たされる問題とその解決策
  64. データベースを活用する方法
  65. UE5.5がインストールされた環境にUE5.4を追加で導入する方法
  66. World PartitionとWorld Compositionの違い
  67. オープンワールドテンプレートとは?
  68. ポーンをスポーンさせても視点を切り替えない方法
  69. キャラクター同士がすり抜けてしまう問題の解決方法
  70. キャラクターの外見を動的に変更
  71. World Partitionでインスタンスが「アンロード済み」になる問題
  72. データ アセットとデータ テーブルの違い
  73. コンポーネントイベントグラフ内で親クラスの変数にアクセスする方
  74. エディターのソースコードの自動保存の頻度を高める方法
  75. SpawnActorでSpawn Transform Rotationが反映されない理由
  76. ミニマップを表示しポーンの位置を反映する方法
  77. RInterp ToとVInterp Toの違い
  78. 毎秒実行するイベントの定義方法
  79. Niagara のエフェクトにコリジョンを持たせる方法
  80. 「Overlap」と「Hit」の違い
  81. OverlapはあるがHitがない原因
  82. Overlapした位置の座標を取得する方法
  83. ブループリントでレベル間のパラメータを受け渡す方法

最近更新/作成されたページ