修改然后重新加载原始纹理数据时,图像看起来已损坏

时间:2019-09-28 13:49:38

标签: c# unity3d colors textures

我正在这个项目中修改纹理/图像。

我有一个用于保存最终图像信息的类,当创建一个类时,我从图像中获取原始纹理数据,并将所有像素存储到NativeArray。

public class PImage
{
    public readonly string      ID              = string.Empty;

    public Texture2D            processed       = null;
    public NativeArray<Color32> pixels          = new NativeArray<Color32>();

    public PImage(Texture2D tex)
    {
        this.ID = Util.GenerateID();

        this.processed = tex;
        this.pixels = this.processed.GetRawTextureData<Color32>();
    }
    public void SetPixels(NativeArray<Color32> pixels)
    {
        this.pixels = pixels;
        this.processed.LoadRawTextureData<Color32>(this.pixels);
        this.processed.Apply();
    }
}

我的项目中有一些功能,一个功能是每当我按下一个按钮时,我就会调用使所有图像像素反转的方法。

public void InvertColors(NativeArray<Color32> pixels)  
{
    if (pixels.Length <= 0) { return; }

    for (int i = 0; i < pixels.Length; i++)
    {
        byte r = (byte)Truncate(255 - pixels[i].r);
        byte g = (byte)Truncate(255 - pixels[i].g);
        byte b = (byte)Truncate(255 - pixels[i].b);
        byte a = pixels[i].a;

        pixels[i] = new Color32(r, g, b, a);
    }

    //Main is a main class that holds a reference to the active image. 
    //GetActiveImage is just a Func<PImage> that returns active PImage reference.

    Main.GetActiveImage().SetPixels(pixels);
}
private float Truncate(float value)
{
    if (value < 0) { return 0; }
    if (value > 255) { return 255; }

    return value;
}

这应该可以正常工作,但是更改后图像看起来已损坏。

enter image description here

尽管一旦我再次按下“反转”按钮,图像就会恢复正常,没有任何损坏。

由于效率高,我使用LoadRawTextureData和GetRawTextureData。我发现使用这些方法比使用SetPixels和GetPixels更快。

有人可以给我一些建议,为什么会发生这种情况?

0 个答案:

没有答案