Ваша формулировка проблемы в вопросе действительно неверна: Ваш дополнительный комментарий (к удаленному ответу):
У меня есть лодка, которая всегда остается в центре экрана, текстура воды (управляется этим шейдером) под ним движется, чтобы он выглядел так, будто лодка движется. Движение текстуры воды контролируется rotation
(для рулевого управления) и yTranslation
(для того, насколько далеко лодка переместилась вперед / назад)
дает понять, что вы запрашиваете другая вещь, и подход, описанный в вопросе, просто не решит вашу проблему.
Когда ваша лодка движется и вращается, она в основном будет двигаться по кривой (и вы хотите, чтобы инверсия этой кривой проходила через текстурное пространство). Но ваши 2dof параметры rotation
и yTranslation
не способны описать кривую. Для вашей задачи нужен как минимум еще один параметр xTranslation
- поэтому в конце вам понадобится двухмерный вектор, описывающий положение вашей лодки + угол, описывающий вращение. И вам нужно правильно накапливать эти данные на каждом шаге симуляции:
- обновлять
rotation
соответственно - вычислять 2D-вектор вашего корабля, который определен текущим
rotation
- масштабируйте его в соответствии со скоростью движения
- накапливайте его на вектор
position
.
Затем ваш шейдер просто должен 1. перевести текскорды на position
(или -position
, что бы вы ни хранили) 2. Поверните вокруг точки поворота (которая постоянна и зависит только от того, как вы выложили свое текстурное пространство)
coord = vec2(mod(coord.x * repeat.x, 1.0f), mod(coord.y * repeat.y, 1.0f));
- это пустая трата циклов ALU графического процессора, TMU уже сделает для вас mod
с режимами обтекания GL_REPEAT
.
Однако теперь у вас есть вращение, масштабирование и перевод. Так что просто используйте единственную матрицу для всего преобразования texcoord - накопление 2D-позиции, о которой я говорил ранее, может быть легко сделано с помощью матричных представлений. Он также удалит sin
и cos
из вашего шейдера, что сейчас является еще одной огромной тратой.