Projector shader: вращение

Для экспериментальных разработок и тем "я нашел чужой исходник, почему он не работает?"

Projector shader: вращение

Сообщение kampari 09 фев 2016, 16:20

Есть шейдер для проектора. На скрине ниже результат того, что он делает. Т.е. проецирует текстуру с альфой на поверхность. Суть проблемы - хочется, чтобы кружочек этот вращался, но я запутался в координатах...

Скрытый текст:
Изображение


Что пытался делать:
Пытался в вершинном шейдере умножить матрицу проектора на матрицу поворота:
Синтаксис:
Используется glsl
v2f vert (appdata_base v)
                        {
                            v2f o;                     
                       
                            float SinX = sin(_Time * _RotationSpeed);
                            float CosX = cos(_Time * _RotationSpeed);
                            float4x4 rotationMat = float4x4(CosX, 0, SinX, 0, 0, 1, 0, 0, -SinX, 0, CosX, 0, 0, 0, 0, 1);      
               
                            float4x4 test = mul (_Projector,rotationMat);
                            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                            o.uvShadow = mul(test , v.vertex); 
                               
                            return o;
                        }
 


Вращение идет относительно оси Y. Круг вращается, но относительно центра плоскости, на которую он проецируется. А нужно, что бы он вращался относительно своего центра. Пытался домнажать uvShadow двумерную матрицу поворота, но результат такой же.

p.s. Если сместить куб в центр плоскости, то круг вращается вокруг своего цента. Почему так?
kampari
UNец
 
Сообщения: 3
Зарегистрирован: 09 фев 2016, 15:22

Re: Projector shader: вращение

Сообщение jetyb 10 фев 2016, 07:47

См матрицу поворота относительно точки. Т.е. нужен перенос и поворот. А у вас только поворот относительно начала координат.
И да, матрицу лучше считать к коде на CPU.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Projector shader: вращение

Сообщение kampari 10 фев 2016, 11:48

Применил двумерную матрицу вращения к uv координатам в пиксельном (фрагментном) шейдере. Вращение идет относительно начала координат текстуры... т.е. левый нижний угол. Как мне задать вращение относительно центра текстуры? При попытке сместить вращение смещается вся текстура и вращение опять же происходит вокруг левого нижнего угла текстуры. См. скрин:

Скрытый текст:
Изображение


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

P.S. Возможно правильнее будет вращать GameObject пустышку, к которому прикреплен проектор, из скрипта через transform.rotate? Или все же через шейдер будет лучше например в плане производительности? Но с точки зрения элегантности хотелось бы в шейдере реализовать это дело))
kampari
UNец
 
Сообщения: 3
Зарегистрирован: 09 фев 2016, 15:22

Re: Projector shader: вращение

Сообщение waruiyume 10 фев 2016, 14:19

uv.xy-=0,5.xx
...
uv.xy+=0,5.xx
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Projector shader: вращение

Сообщение kampari 10 фев 2016, 14:43

waruiyume Спасибо! Работает. Как же все просто оказалось...

P.S. Раньше изначально пытался сдвинуть точку вращения с помощью uv.xy-=0,5.xx, но после умножения на матрицу вращения не додумался вернуть координаты ( uv.xy+=0,5.xx )... балда я =))
kampari
UNец
 
Сообщения: 3
Зарегистрирован: 09 фев 2016, 15:22


Вернуться в Шейдерная кузня

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1