UE4:输出游戏帧到文件
UE4: output game frames to file
这适用于Unreal Engine 4.9
每一帧,我都想把它保存到文件中(覆盖现有的)。
对于我制作的一个简单的 D3D11 演示,我已经能够做到这一点:
void Engine::CaptureFrame(D3DX11_IMAGE_FILE_FORMAT format, const LPCTSTR fileName){
backbuffer->GetResource(&resource);
ID3D11Texture2D* texture;
HRESULT hResult = resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<LPVOID*>(&texture));
D3DX11SaveTextureToFile(deviceContext, texture, format, fileName);
//Clean up
texture->Release();
resource->Release();
}
我也用 OpenGL 做到了这一点,使用了一个名为“FreeImage”的库。
我不想修改 UE4 源,正在寻找一种方法 "hook" 进入 UE4 和 "capture" 框架。
我已经设法用 Open Broadcasting Software 做到了这一点,但我想在 UE4 中通过 C++ 或蓝图本机地做到这一点。
我也知道I can do this from the editor,但这不是我想做的。我想在 运行 时间自动执行此操作。
我该怎么做?有可能吗?
对于其他想要这样做的人,您有两种选择。
选项 A
如果你不关心生成多少个截图文件,也不关心它们叫什么,那么你可以使用蓝图:
图像将输出到 \Unreal Projects\ProjectName\Saved\Screenshots\Windows
,其中 ProjectName
是您的项目名称。
选项 B
如果您不想要多个屏幕截图文件并且需要控制它们的去向,那么您可以通过代码实现:
//Called every frame
void AMyDempActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FString filename = "test.png";
FScreenshotRequest::RequestScreenshot(filename, false, false);
}
上的文档
这适用于Unreal Engine 4.9
每一帧,我都想把它保存到文件中(覆盖现有的)。
对于我制作的一个简单的 D3D11 演示,我已经能够做到这一点:
void Engine::CaptureFrame(D3DX11_IMAGE_FILE_FORMAT format, const LPCTSTR fileName){
backbuffer->GetResource(&resource);
ID3D11Texture2D* texture;
HRESULT hResult = resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<LPVOID*>(&texture));
D3DX11SaveTextureToFile(deviceContext, texture, format, fileName);
//Clean up
texture->Release();
resource->Release();
}
我也用 OpenGL 做到了这一点,使用了一个名为“FreeImage”的库。
我不想修改 UE4 源,正在寻找一种方法 "hook" 进入 UE4 和 "capture" 框架。
我已经设法用 Open Broadcasting Software 做到了这一点,但我想在 UE4 中通过 C++ 或蓝图本机地做到这一点。
我也知道I can do this from the editor,但这不是我想做的。我想在 运行 时间自动执行此操作。
我该怎么做?有可能吗?
对于其他想要这样做的人,您有两种选择。
选项 A
如果你不关心生成多少个截图文件,也不关心它们叫什么,那么你可以使用蓝图:
图像将输出到 \Unreal Projects\ProjectName\Saved\Screenshots\Windows
,其中 ProjectName
是您的项目名称。
选项 B
如果您不想要多个屏幕截图文件并且需要控制它们的去向,那么您可以通过代码实现:
//Called every frame
void AMyDempActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FString filename = "test.png";
FScreenshotRequest::RequestScreenshot(filename, false, false);
}
上的文档