BadCats
@BadCats

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

Имеется следующая ситуация: в 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).

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

В чем проблема?
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
Так вы же так текстуру уродуете. Проще всего это в shader запихнуть. Подбираете ширину полосы, и передаёте в шейдер в каком месте её разместит. Шейдер типа с такой логикой:
sampler2D _MainTex;
half _LinePos;
half _LineHeight;

fixed4 frag (v2f i) : SV_Target
{
	fixed4 col = tex2D(_MainTex, i.uv);
	float b = i.uv.x < _LinePos || i.uv.x > _LinePos + _LineHeight;

	col.rgb = col.rgb * b;
	return col;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Плохо документацию читали, после SetPixel нужно вызывать Texture2D.Apply.
А вообще говоря, рисовать лучше декалями или частицами, рисование по тектуре работает очень медленно, в качестве примера посмотрите этот туториал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы