Unity: GetPixels () всегда приводит к черному цвету на всем изображении - PullRequest
1 голос
/ 13 мая 2019

У меня есть изображение (прилагается), которое я использую в качестве теста. Я пытаюсь получить и сохранить все цвета каждого пикселя в массиве.

Я использую приведенный ниже код для этого;

    Texture2D tex = mapImage.mainTexture as Texture2D;

    int w = tex.width;
    int h = tex.height;
    Vector4[,] vals = new Vector4[w, h];

    Color[] cols = tex.GetPixels();
    for (int y = 0; y < h; y++)
    {
        for (int x = 0; x < w; x++)
        {
            if(cols[y+x] != Color.black)
            {
                Debug.Break();
            }

            vals[x, y] = cols[(y + x)];
        }
    }

Где mapImage - публичная переменная Material, которую я перетаскиваю в сцену в префабе. Как видите, я добавил тест отладки, чтобы приостановить работу редактора, если достигнут не черный цвет. Этого НИКОГДА не бьют никогда.

Интересно, что у меня есть другой скрипт, который запускает и сообщает мне значения цвета (GetPixel ()) в позиции щелчка, используя то же изображение. Работает нормально (разные методы, но оба в конечном итоге используют один и тот же материал)

Я в недоумении, почему GetPixels () всегда получается черным?

Я также думал о том, чтобы просто загрузить данные изображения в байтовый массив, затем проанализировать значения в Vector4, но надеялся, что в конечном итоге это сработает.

enter image description here

1 Ответ

2 голосов
/ 13 мая 2019

Вы неправильно индексируете массив Color. С индексами, которые вы используете, y+x, вы продолжаете проверять одни и те же значения в самых низких строках текстуры, никогда не преодолевая определенную точку.

Вместо этого при расчете индекса необходимо умножить строку, в которой вы находитесь, на длину строки и добавить ее в столбец, в котором вы находитесь:

Texture2D tex = mapImage.mainTexture as Texture2D;

int w = tex.width;
int h = tex.height;
Vector4[,] vals = new Vector4[w, h];

Color[] cols = tex.GetPixels();
for (int y = 0; y < h; y++)
{
    for (int x = 0; x < w; x++)
    {
        int index = y * w + x;
        vals[x, y] = cols[index];
    }
}

Из документации на GetPixels:

Возвращенный массив - это сплющенный 2D-массив, в котором пиксели располагаются слева направо, снизу вверх (т. Е. Строка за строкой). Размер массива - это ширина по высоте используемого уровня mip. Уровень мипа по умолчанию равен нулю (базовая текстура), и в этом случае размер равен только размеру текстуры. В общем случае размер уровня mip равен mipWidth=max(1,width>>miplevel) и аналогично для высоты.

...