C++ 如何将FTEXTRARE2DRHIREF导出到png?

C++ 如何将FTEXTRARE2DRHIREF导出到png?,c++,textures,unreal-engine4,C++,Textures,Unreal Engine4,正如虚幻引擎文档在这里提到的 纹理是在材质中使用的图像。它们被映射到 将材质应用到的曲面 是否有一个反向选项,一种将纹理导出到文件(.png)的方法?假设我们有FTexture2DRHIRef纹理,我们如何获得纹理的原始数据并将其保存在文件中 另外,在Unreal EngineUTexture2D、FRHITexture2D等一些工具中,纹理类太多了。我在哪里可以找到关于虚幻引擎中纹理及其差异的详细解释 当然可以选择将纹理保存到文件,但首先您需要知道RHIstructs和UTexture对象之间

正如虚幻引擎文档在这里提到的

纹理是在材质中使用的图像。它们被映射到 将材质应用到的曲面

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


另外,在Unreal Engine
UTexture2D
FRHITexture2D
等一些工具中,纹理类太多了。我在哪里可以找到关于虚幻引擎中纹理及其差异的详细解释

当然可以选择将纹理保存到文件,但首先您需要知道
RHI
structs和
UTexture
对象之间的区别

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

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

为了回答您的问题,要将纹理保存到文件中,您应该使用
ffilehalper
结构中的一种方法,即
SaveArrayToFile
,作为输入,您需要原始纹理数据(或压缩位图
fimagutils::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();
}
void GetTexturePixels(FTexture2DRHIRef纹理、TArray和OutPixels)
{
结构FReadSurfaceContext
{
FTEXTRARE2DRHIREF纹理;
TArray*OutData;
FIntRect-Rect;
FReadSurfaceDataFlags;
};
OutPixels.Reset();
FReadSurfaceContext ReadSurfaceContext=
{
纹理
&输出信号,
FIntRect(0,0,纹理->GetSizeXY().X,纹理->GetSizeXY().Y),
FReadSurfaceDataFlags(RCM_UNorm,CubeFace_MAX)
};
排队\u唯一\u渲染\u命令\u一个参数(
ReadSurfaceCommand,
FReadSurfaceContext,Context,ReadSurfaceContext,
{
RHICmdList.ReadSurfaceData(
上下文,纹理,
Context.Rect,
*Context.OutData,
上下文。标志
);
});
FlushRenderingCommands();
}

Is
OutPixels.Reset()必要吗?为什么?我觉得没必要。可能该方法的所有实现(我只检查了一些)都会在设置数据之前清除输出向量。