Необходимо учитывать соотношение сторон окна просмотра.
Если окно имеет то же соотношение сторон, что и изображение, соотношение сторон можно рассчитать по размеру изображения:
float aspect = inputImageTextureSize.x / inputImageTextureSize.y;
Масштабирование компонента u координаты текстуры до поворота по соотношению сторон (* aspect
) и масштабирование по обратному соотношению сторон (* 1.0/aspect
) после поворота:
tc -= HALF.xy;
tc.x *= aspect;
tc *= mat2(aCos, aSin, -aSin, aCos);
tc.x *= 1.0/aspect;
tc += HALF.xy;
Чтобы прояснить поведение, то же самое можно выразить с помощью матричных операций:
float aSin = sin(angle);
float aCos = cos(angle);
float aspect = u_resolution.x / u_resolution.y;
mat2 rotMat = mat2(aCos, -aSin, aSin, aCos);
mat2 scaleMat = mat2(aspect, 0.0, 0.0, 1.0);
mat2 scaleMatInv = mat2(1.0/aspect, 0.0, 0.0, 1.0);
tc -= HALF.xy;
tc = scaleMatInv * rotMat * scaleMat * tc;
tc += HALF.xy;