如何在UnrealEngine中对非2幂的纹理进行降采样?

时间:2019-05-14 06:16:27

标签: c++ image unreal-engine4

我正在以约1920x1080的分辨率乘以4之类的过采样值来渲染视口。现在,我需要将渲染后的分辨率7680‬x4320降采样为1920x1080。

我可以在虚幻引擎中使用任何功能吗?或任何能很好地处理此问题的图书馆(仅Windows)? 还是用自己的方式写这本书的合适方法?

我们尝试实施下采样,但是仅当SnapshotScale为2时才有效,当SnapshotScale大于2时,它似乎对图像质量没有影响。

UTexture2D* AAVESnapShotManager::DownsampleTexture(UTexture2D* Texture)
{

    UTexture2D* Result = UTexture2D::CreateTransient(RenderSettings.imageWidth, RenderSettings.imageHeight, PF_B8G8R8A8);

    void* TextureDataVoid = Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_ONLY);

    void* ResultDataVoid = Result->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);

    FColor* TextureData = (FColor*)TextureDataVoid;
    FColor* ResultData = (FColor*)ResultDataVoid;

    int32 WindowSize = RenderSettings.resolutionScale / 2;

    for (int x = 0; x < Result->GetSizeX(); ++x)
    {
        for (int y = 0; y < Result->GetSizeY(); ++y)
        {
            const uint32 ResultIndex = y * Result->GetSizeX() + x;

            uint32_t R = 0, G = 0, B = 0, A = 0;

            int32 Samples = 0;

            for (int32 dx = -WindowSize; dx < WindowSize; ++dx)
            {
                for (int32 dy = -WindowSize; dy < WindowSize; ++dy)
                {

                    int32 PosX = (x * RenderSettings.resolutionScale + dx);
                    int32 PosY = (y * RenderSettings.resolutionScale + dy);

                    if (PosX < 0 || PosX >= Texture->GetSizeX() || PosY < 0 || PosY >= Texture->GetSizeY())
                    {
                        continue;
                    }

                    size_t TextureIndex = PosY * Texture->GetSizeX() + PosX;
                    FColor& Color = TextureData[TextureIndex];
                    R += Color.R;
                    G += Color.G;
                    B += Color.B;
                    A += Color.A;
                    ++Samples;
                }
            }

            ResultData[ResultIndex] = FColor(R / Samples, G / Samples, B / Samples, A / Samples);
        }
    }

    Texture->PlatformData->Mips[0].BulkData.Unlock();
    Result->PlatformData->Mips[0].BulkData.Unlock();

    Result->UpdateResource();

    return Result;

}

我希望可以在SnapshotScale中使用任何正int值的高质量过采样的Texture输出。

1 个答案:

答案 0 :(得分:0)

我有个建议。它不是很直接,但是不涉及图像过滤的编写或库的导入。

  1. 使用节点TextureObject-> TextureSample->连接到发光的节点制作不发光的材料。

  2. 使用函数中开始的纹理在材质的“材质实例动态”上填充“纹理对象”。

  3. 使用“绘制材质以渲染目标”功能将“材质实例动态”绘制到以目标分辨率预先设置的渲染目标。