2015-01-21 1 views
6

Я пытаюсь повернуть текстуру в фрагментном шейдере, вместо использования шейдерных шейдеров и матричных преобразований.Вращение текстуры на фрагментном шейдере в GLSL ES

Вращение имеет стержень в центре.

Алгоритм отлично работает при рендеринге в квадрате с квадратной формой, но когда квадратик имеет прямоугольную форму, результат рендеринга становится беспорядочным. Любой может решить проблему?

Спасибо

varying vec2 v_texcoord; 
    uniform sampler2D u_texture; 
    uniform float u_angle; 

    void main() 
    { 
     vec2 coord = v_texcoord; 
     float sin_factor = sin(u_angle); 
     float cos_factor = cos(u_angle); 
     coord = (coord - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor); 
     coord += 0.5; 

     gl_FragColor = texture2D(u_texture, coord); 
    } 
+0

Я ищу его тоже! Решено ли? – Samsy

+0

Я сделал это, построив матрицу для вращения за пределами шейдера, http://stackoverflow.com/questions/31417365/how-to-rotate-a-texture-in-a-shader-android, вы также можете найти это полезно для выяснения компонентов матрицы, http://www.songho.ca/opengl/gl_projectionmatrix.html – HPP

ответ

-1

Я не пробовал это сам, но я думаю, что, поскольку вы используете координаты текстуры в прямоугольном пространстве, то это вызовет искажение при вращении без какого-либо фактора, чтобы исправить Это.

Вам необходимо передать ему форму, которая объявляет ширину и высоту вашей текстуры. При этом вы можете применить соотношение сторон для коррекции искажения.

coord = (coord - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor); 

может стать чем-то вроде:

coord = vec2(coord.x - (0.5 * Resolution.x/Resolution.y), coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor); 

Как я уже говорил, хотя, я не пробовал, но я должен был сделать это в прошлом для подобных шейдеров. Может потребоваться отменить Resolution.x/Resolution.y.

2

Следующая строка кода, который был представлен в этом вопросе:

coord = vec2(coord.x - (0.5 * Resolution.x/Resolution.y), coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor); 

не совсем верно. Имеются некоторые ошибки брекетинга.

Правильная версия будет:

coord = vec2((coord.x - 0.5) * (Resolution.x/Resolution.y), coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor); 
+0

Это отлично поработало для меня, спасибо! – Hobbes