Изображение выглядит поврежденным при изменении и последующей загрузке необработанных данных текстуры - PullRequest
0 голосов
/ 28 сентября 2019

Я работаю над этим проектом, в котором я изменяю текстуры / изображения.

У меня есть этот класс, который содержит информацию о моем конечном изображении, при создании класса я получаю необработанные данные текстуры из изображения и сохраняю всепикселей в 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.

Может кто-нибудь дать мне совет, почему это может происходить?

...