如何将FTexture2DRHIRef导出到png?

时间:2017-07-21 13:35:55

标签: c++ textures unreal-engine4

正如虚幻引擎文档在此提及documentation

  

纹理是在Material中使用的图像。它们被映射到   材料应用于的表面。

是否有反向选项,一种将纹理导出到文件的方法(例如.png)?假设我们有FTexture2DRHIRef texture,我们如何获取纹理的原始数据并将其保存在文件中?

虚幻引擎UTexture2DFRHITexture2D等等中的纹理类太多了。我在哪里可以找到有关纹理及其在虚幻引擎中的差异的详细说明?

1 个答案:

答案 0 :(得分:3)

当然,将纹理保存到文件是一种选择,但首先您需要知道RHI结构和UTexture对象之间的区别。

渲染硬件接口(RHI)是一种高级平台无关的渲染代码。它为引擎/渲染器的低级平台相关部分提供API。

我不确定,如何正确定义UTexture,但一般来说游戏中使用的对象,编辑器代码,材料等等。他们有RHI结构的参考。

在回答您的问题时,要将纹理保存到文件,您应该使用FFileHelper结构中的一种方法,即SaveArrayToFile作为输入,您需要具有原始纹理数据(或压缩)位图FImageUtils::CompressImageArray),这可能是另一个问题。某种纹理(如RenderTargets)有方法ReadPixels,它返回一个像素数组,但是当纹理没有那个方法时该怎么办?

您需要深入研究RHI API并将一些渲染器命令排入队列,例如:

void GetTexturePixels(FTexture2DRHIRef Texture, TArray<FColor>& OutPixels)
{
    struct FReadSurfaceContext
    {
        FTexture2DRHIRef Texture;
        TArray<FColor>* OutData;
        FIntRect Rect;
        FReadSurfaceDataFlags Flags;
    };

    OutPixels.Reset();
    FReadSurfaceContext ReadSurfaceContext =
    {
        Texture,
        &OutPixels,
        FIntRect(0, 0, Texture->GetSizeXY().X, Texture->GetSizeXY().Y),
        FReadSurfaceDataFlags(RCM_UNorm, CubeFace_MAX)
    };

    ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER(
        ReadSurfaceCommand,
        FReadSurfaceContext, Context, ReadSurfaceContext,
        {
            RHICmdList.ReadSurfaceData(
                Context.Texture,
                Context.Rect,
                *Context.OutData,
                Context.Flags
            );
        });
    FlushRenderingCommands();
}