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

Вращение текстуры в шейдере

СообщениеДобавлено: 23 сен 2018, 19:54
Zodjeks
Всем привет.
Интересует вопрос, как вращать только одну текстуру в шейдере, погуглив получилось сделать вращение всех через матрицу.
В шейдерах не особо разбираюсь, буду благодарен любой помощи.
Собственно вот фрагмент вращения текстур в шейдере
Синтаксис:
Используется csharp
float _DetailAngle;
int _isRotat;
void vert (inout appdata_full v) {
v.texcoord.xy -=0.5;
if (_isRotat==45) { _DetailAngle=-0.786; }
if (_isRotat==-45) { _DetailAngle=0.786; }
if (_isRotat==90) { _DetailAngle=-1.57; }
if (_isRotat==-90) { _DetailAngle=1.57; }
if (_isRotat==180) { _DetailAngle=-3.14; }
if (_isRotat==-180) { _DetailAngle=6.28; }
float s = sin ( _DetailAngle);
float c = cos ( _DetailAngle);

float2x2 rotationMatrix = float2x2( c, -s, s, c);
rotationMatrix *=0.5;
rotationMatrix +=0.5;
rotationMatrix = rotationMatrix * 2-1;
v.texcoord.xy = mul ( v.texcoord.xy, rotationMatrix );
v.texcoord.xy += 0.5;
}

Может быть как-то по-другому можно добиться вращения одной текстуры?
Заранее спасибо.

Re: Вращение текстуры в шейдере

СообщениеДобавлено: 24 сен 2018, 01:31
Cr0c
Не в v.texcoord.xy вращение сохраняй, а в отдельную переменную, её и будешь использовать как координату при получении пикселя.

Re: Вращение текстуры в шейдере

СообщениеДобавлено: 24 сен 2018, 20:27
Zodjeks
Cr0c писал(а):Не в v.texcoord.xy вращение сохраняй, а в отдельную переменную, её и будешь использовать как координату при получении пикселя.

Ну предположим float2 uv2 : TEXCOORD1;
Где мне ее объявлять и как обратиться к ней в surf ?
Если смешивал в surf текстуру с текстурой для вращения (_DetailMap) так
Синтаксис:
Используется csharp
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex)* _MainColor;
tex.rgb *= tex2D(_DetailMap,IN.uv_DetailMap).rgb*_DetailRange;

Re: Вращение текстуры в шейдере

СообщениеДобавлено: 29 сен 2018, 18:16
Zodjeks
Собственно сделал)
Кому интересно
Синтаксис:
Используется csharp
float _DetailAngle;
void vert (inout appdata_full v) {
v.texcoord1 = v.texcoord;   //сохраняем uv для вращения одной текстуры  
v.texcoord1.xy -= 0.5;
float s, c;
sincos(radians(_DetailAngle), s, c);
float2x2 rotationMatrix = float2x2(c, -s, s, c);
v.texcoord1.xy = mul(v.texcoord1.xy, rotationMatrix);
v.texcoord1.xy += 0.5;
}