Страница 1 из 1

Как написать шейдер для управления матрицей пикселей?

СообщениеДобавлено: 01 июл 2020, 14:17
iNji555
Здравствуйте. Такой вопрос. Мне нужно разбить экран на определенное количество пикселей, например 480х270, и управлять из кода каждым из них.

Сейчас я это делаю через спарйт, который растянут на весь экран в канвасе.
Управляю яркостью зеленого в конкретном пикселе, заранее подготавливая этот параметр в массиве Mas[,]
Синтаксис:
Используется csharp
// Start ---
texture = new Texture2D(winW, winH);
sprite = Sprite.Create(texture, new Rect(0, 0, winW, winH), Vector2.zero);
Pole.GetComponent<Image>().sprite = sprite;

// Update ---
for (int x = 0; x < winW; x++)
    for (int y = 0; y < winH; y++)
        texture.SetPixel(x, y, new Color(0, Mas[x, y], 0, 1));
 


Жрет это хозяйство треть процессора.
Когда еще только искал возможность делать так, мне говорили, что лучше делать это через шейдер, потому что через спрайт будет очень ресурсоемко.
Но никто не знает как это сделать через шейдер.
Посмотрел неколько видео, полистал статейки, не нашел ничего к чему можно зацепиться, непонятно там ВСЁ.

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

Памагити.

Re: Как написать шейдер для управления матрицей пикселей?

СообщениеДобавлено: 03 июл 2020, 08:03
jetyb
1. Тут же самое интересное место не передача массива в текстуру, а изменение этого массива. Как Mas меняется? Изменения же надо проводить в шейдере на видеокарте.
2. делать попиксельно texture.SetPixel очень затратно, быстрее texture.SetPixels (и texute.Apply() в самом конце написать).

Re: Как написать шейдер для управления матрицей пикселей?

СообщениеДобавлено: 03 июл 2020, 13:15
Tolking
Зачем каждый раз менять все пиксели текстуры? Зачем делать это каждый кадр?

Re: Как написать шейдер для управления матрицей пикселей?

СообщениеДобавлено: 04 июл 2020, 18:38
iNji555
1. Тут же самое интересное место не передача массива в текстуру, а изменение этого массива. Как Mas меняется? Изменения же надо проводить в шейдере на видеокарте.
2. делать попиксельно texture.SetPixel очень затратно, быстрее texture.SetPixels (и texute.Apply() в самом конце написать).


Как раз с массивом играться вроде как ничего не стоит, но небольшой, и я там пытаюсь делать несложные видеоэффекты, в меру своих возможностей.

texute.Apply() - Там и так делается после всех for, не в них.

Зачем каждый раз менять все пиксели текстуры? Зачем делать это каждый кадр?


В моем случае в этом есть прямая необходимость.