Skip to content

strangechu's Blog

  • About me
  • GitHub
  • LinkedIn

strangechu's Blog

Work & Game

[UE4] 將RenderTarget轉成Color陣列以儲存至SaveData

11 月 13, 2020 by strangechu

有時我們會需要儲存RenderTarget的Pixel資訊在遊戲存檔,如地圖探索範圍、拍照照片等等。然而UE4的SaveData不支援直接儲存RenderTarget,因此需要轉化成可以儲存的格式。這邊我們使用FColor的陣列儲存。

儲存:RenderTarget至TArray<FColor>

使用ReadPixels

TArray<FColor> OutputBuffer;
UTextureRenderTarget2D* RenderTarget = GetSourceFogRenderTarget();
     FTextureRenderTarget2DResource* TextureResource = (FTextureRenderTarget2DResource*)RenderTarget->GameThread_GetRenderTargetResource();

TextureResource->ReadPixels(OutputBuffer);

之後將OutputBuffer以一般陣列儲存即可。

讀取:TArray<FColor>至RenderTarget

透過Canvas將Pixel資訊畫回RenderTarget

TArray<FColor> InputBuffer;
UTextureRenderTarget2D* RenderTarget = GetSourceFogRenderTarget();
UCanvas* Canvas;
FVector2D Size;
FDrawToRenderTargetContext RenderContext;
UKismetRenderingLibrary::BeginDrawCanvasToRenderTarget(this, RenderTarget, Canvas, Size, RenderContext);
if (Canvas)
	{
	// 讀取的PixelData寫入Texture (MipMaps [0])
	UTexture2D* ReconstructedTexture = UTexture2D::CreateTransient(RenderTarget->SizeX, RenderTarget->SizeY, PF_B8G8R8A8);
	uint8* MipData = (uint8*)ReconstructedTexture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
	const int32 DataSize = RenderTarget->SizeY * RenderTarget->SizeX * 4;
	FMemory::Memcpy(MipData, InputBuffer.GetData(), DataSize);

	ReconstructedTexture->PlatformData->Mips[0].BulkData.Unlock();
	ReconstructedTexture->UpdateResource();

	// 將Texture填滿Canvas
	Canvas->K2_DrawTexture(ReconstructedTexture, FVector2D::ZeroVector, Size, FVector2D(0, 0), FVector2D(1, 1), FLinearColor::White, EBlendMode::BLEND_Opaque);
}
UKismetRenderingLibrary::EndDrawCanvasToRenderTarget(this, RenderContext);

Post navigation

Previous Post:

個人遊戲月報 2020年10月

Next Post:

遊戲雜談-關於原神與抄襲

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

近期文章

  • 從《33遠征隊》看日本遊戲業的未來——JRPG的蛻變與停滯
  • 機戰傭兵6 玩後感
  • 沉沒意志 玩後感
  • Fallout影集觀後感
  • [CEDEC2024]薩爾達的餘料建造開發減法

近期留言

  • 「strangechu」於〈個人遊戲月報 2020年8月〉發佈留言
  • 「扇」於〈個人遊戲月報 2020年8月〉發佈留言

彙整

  • 2025 年 5 月
  • 2025 年 1 月
  • 2024 年 9 月
  • 2024 年 8 月
  • 2024 年 5 月
  • 2024 年 4 月
  • 2024 年 3 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2023 年 5 月
  • 2023 年 4 月
  • 2023 年 3 月
  • 2023 年 1 月
  • 2022 年 12 月
  • 2022 年 10 月
  • 2022 年 9 月
  • 2022 年 5 月
  • 2022 年 3 月
  • 2022 年 2 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 10 月
  • 2021 年 3 月
  • 2020 年 12 月
  • 2020 年 11 月
  • 2020 年 10 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 3 月
  • 2020 年 2 月
  • 2019 年 7 月
  • 2019 年 4 月

分類

  • Career
  • Game
  • Game Review
  • Monthly Report
  • UE4
  • UE5
  • Uncategorized
  • 技術
  • 演講心得

其他操作

  • 登入
  • 訂閱網站內容 RSS 資訊提供
  • 訂閱網站留言 RSS 資訊提供
  • WordPress 台灣繁體中文
© 2025 strangechu's Blog | WordPress Theme by Superbthemes