正如虚幻的引擎文档在这里提到的那样,文档
纹理是在Materials.They中使用的图像,被映射到应用于材料的表面。
有没有反向选项,一种将纹理导出到文件的方法(例如.png)?假设我们有FTexture2DRHIRef texture,我们如何获得纹理的原始数据并将其保存在文件中?
此外,在虚幻引擎UTexture2D、FRHITexture2D和更多的纹理类中也有太多的纹理类。我在哪里可以找到一个详细的解释纹理和他们的差异在虚幻引擎?
发布于 2017-08-08 10:56:07
当然,这是将纹理保存到文件中的选项,但首先您需要知道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();
}发布于 2022-02-18 16:19:42
首先,您需要从UTexture获得FTexture2DRHIRef。我使用这段代码从当前的游戏视图中创建纹理:
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);
});
}https://stackoverflow.com/questions/45239108
复制相似问题