Unity3d GetPixels не изменяет текстуру

155
14 февраля 2018, 08:46

Имеется следующая ситуация: в Unity - у меня есть некий материал содержащий некую текстуру. Стоит следующая задача: при скролинге мышью по игровому объекту с данным материалом - рисовать линии на объекте - т.е как в Paint - но в realTime и по любому объекту на сцене. Для этого я добавил к объекту скрипт содержащий метод Draw:

public void Draw()
{
    Vector2 MouseVector = new Vector2(OnMouseUp(),OnMouseDown());
   Vector2 ImageVector = new Vector2( MainSHDtexture.width,MainSHDtexture.height);
    for (int i = 0; i < ImageVector.magnitude; i++)
    {
        if (MouseVector.x<=ImageVector.x && MouseVector.y <= ImageVector.x) 
        {
            int K = System.Convert.ToInt32(MouseVector.y);
            int L = System.Convert.ToInt32(MouseVector.x);
            for (K++; i < ImageVector.x; i++)
            {
                for (L++; i < ImageVector.y; i++)
                {
                    Texture2D tx = (Texture2D)MainSHDtexture;
                    tx.SetPixel(K , L , Color.white);
                    MainSHDtexture = tx;
                }
            }
        }
        else if (MouseVector.y >= ImageVector.x ) 
        {
            int K = System.Convert.ToInt32(MouseVector.y);
            for (K++; i < ImageVector.y; i++)
            {
                Texture2D tx = (Texture2D)MainSHDtexture;
                tx.SetPixel(K , System.Convert.ToInt32( ImageVector.x), Color.white);
                MainSHDtexture = tx;
            }
        }
        else if (MouseVector.x <= ImageVector.y)
        {
            int K = System.Convert.ToInt32(MouseVector.x);
            for (K++; i < ImageVector.y; i++)
            {
                Texture2D tx = (Texture2D)MainSHDtexture;
                tx.SetPixel(K , System.Convert.ToInt32(ImageVector.y) , Color.white);
                MainSHDtexture = tx;
            }
        }
    }

}

Идею скрипта в следующем чем-то похожа на IntervalTree - пусть передвижения мыши можно задать как вектор - где его начало это нажатие кнопки, а его конец - соответственно- случай когда мы отпускаем кнопку мыши.

Соответственно в OnMouseUp() и OnMouseDown() - я возвращая координаты мыши X и Y

Точно так же в виде вектора можно задать и текстуру - начиная от ширины - заканчивая высотой - получится один отрезок суммарной длины.

Т.е сама задача сводится заменить пиксели из вектора ImageVector на все пиксели длины MouseVector. Я предпологая, что эт вектора не пересекаются, а параллельны, причем MouseVector - лежит "выше" ImageVector - и проекция MouseVector -это то самое количество пикселей необходимое для замены.

Далее я рассматриваю три случая - полной проекции MouseVector в ImageVector , проекции только головы MouseVector в начало ImageVector и проекции хвоста MouseVector в ImageVector .

Также хочу отметить что K++ - сделано от безвыходности - т.к разрешены только операции инкремента, дикремента и создания нового объекта.

Студиия и Unity ошибок не выдает, но скрипт не выполняет поставленной задачи - т.е не сетит нужные пиксели текстуры в нужный цвет.

Также смотрел под Debug с помощью точек-останова - скрипт при выполнении заходит во второй блок if (тот который else if).

Запись/чтение в свойствах текстуры - при импорте -разрешил.

В чем проблема?

Answer 1

После того, как вы применяете SetPixel или SetPixels к текстуре, вы обязательно должны вызывать метод Texture2D.Apply(), для того, чтобы записать ваши изменения в текстуру. Если не вызывать этот метод, то вы не увидите никаких изменений.

Также, хочу заметить, что применение SetPixel или SetPixels к тексутрам, будет работать только для текстур без сжатия. То есть к примеру для сжатия PVRTC(iOS нативное сжатие) данные методы работать не будут и вы получите ошибку в консоли.

READ ALSO
Не работает условие

Не работает условие

Не срабатывает true, хотя долженМожет кто увидит ошибку в синтаксисе

187
Как кинуть текущий год в содержимое тега?

Как кинуть текущий год в содержимое тега?

Как кинуть текущий год в содержимое тега? текущий год могу найти а как кинуть не получается

245
Работа с файловой системой на USB носителе

Работа с файловой системой на USB носителе

Разрабатываем операционную систему JsOSНужно написать драйвер для работы с ФС на USB носителе

217