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

Projector shader: вращение

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

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


Что пытался делать:
Пытался в вершинном шейдере умножить матрицу проектора на матрицу поворота:
Синтаксис:
Используется 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. Если сместить куб в центр плоскости, то круг вращается вокруг своего цента. Почему так?

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

СообщениеДобавлено: 10 фев 2016, 07:47
jetyb
См матрицу поворота относительно точки. Т.е. нужен перенос и поворот. А у вас только поворот относительно начала координат.
И да, матрицу лучше считать к коде на CPU.

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

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

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


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

P.S. Возможно правильнее будет вращать GameObject пустышку, к которому прикреплен проектор, из скрипта через transform.rotate? Или все же через шейдер будет лучше например в плане производительности? Но с точки зрения элегантности хотелось бы в шейдере реализовать это дело))

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

СообщениеДобавлено: 10 фев 2016, 14:19
waruiyume
uv.xy-=0,5.xx
...
uv.xy+=0,5.xx

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

СообщениеДобавлено: 10 фев 2016, 14:43
kampari
waruiyume Спасибо! Работает. Как же все просто оказалось...

P.S. Раньше изначально пытался сдвинуть точку вращения с помощью uv.xy-=0,5.xx, но после умножения на матрицу вращения не додумался вернуть координаты ( uv.xy+=0,5.xx )... балда я =))