正如虚幻引擎文档在此提及documentation
纹理是在Material中使用的图像。它们被映射到 材料应用于的表面。
是否有反向选项,一种将纹理导出到文件的方法(例如.png)?假设我们有FTexture2DRHIRef texture
,我们如何获取纹理的原始数据并将其保存在文件中?
虚幻引擎UTexture2D
,FRHITexture2D
等等中的纹理类太多了。我在哪里可以找到有关纹理及其在虚幻引擎中的差异的详细说明?
答案 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();
}