首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将FTexture2DRHIRef输出到png?

如何将FTexture2DRHIRef输出到png?
EN

Stack Overflow用户
提问于 2017-07-21 13:35:54
回答 2查看 2.8K关注 0票数 1

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

纹理是在Materials.They中使用的图像,被映射到应用于材料的表面。

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

此外,在虚幻引擎UTexture2DFRHITexture2D和更多的纹理类中也有太多的纹理类。我在哪里可以找到一个详细的解释纹理和他们的差异在虚幻引擎?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-08 10:56:07

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

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

我不知道如何正确地定义UTexture,但是在游戏中通常会用到对象、编辑器代码、材料等,它们都有RHI结构的引用。

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

您需要深入研究RHI API,并对一些呈现器命令进行排队,例如:

代码语言:javascript
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2022-02-18 16:19:42

首先,您需要从UTexture获得FTexture2DRHIRef。我使用这段代码从当前的游戏视图中创建纹理:

代码语言:javascript
复制
 void UScenarioBP_Library::CopyViewportToRenderTarget(UObject* WorldRef, UTextureRenderTarget2D* RenderTarget)
{
    UGameViewportClient* ViewportClient = WorldRef->GetWorld()->GetGameViewport();
    FSceneViewport* Viewport = ViewportClient->GetGameViewport();
    FTexture2DRHIRef Texture = Viewport->GetRenderTargetTexture();
    FRHITexture2D* TextureRHI = Texture->GetTexture2D();

    ENQUEUE_RENDER_COMMAND(ReadSurfaceCommand)(
        [Texture, RenderTarget](FRHICommandListImmediate& RHICmdList)
    {
        FTexture2DRHIRef destTexture = RenderTarget->GetRenderTargetResource()->GetRenderTargetTexture();
        FResolveParams param;
        RHICmdList.CopyToResolveTarget(Texture, destTexture, param);
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45239108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档