2015-01-21 16 views
6

Ich versuche, eine Textur in einem Fragment-Shader zu rotieren, anstatt die Vertex-Shader- und Matrix-Transformationen zu verwenden.Eine Textur auf einem Fragment-Shader in GLSL ES drehen

Die Drehung hat den Drehpunkt in der Mitte.

Der Algorithmus funktioniert gut beim Rendern in einem Quad mit einer quadratischen Form, aber wenn das Quad eine rechteckige Form hat, wird das Renderergebnis durcheinander gebracht. Kann jeder das Problem erkennen?

Danke

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

Ich bin auch für sie suchen! Ist es gelöst? – Samsy

+0

Ich habe dies getan, indem ich eine Matrix außerhalb des Shaders zu drehen, http://stackoverflow.com/questions/31417365/how-to-rotate-a-texture-in-a-shader-android, können Sie dies auch finden hilfreich für herauszufinden, die Matrix-Komponenten, http://www.songho.ca/opengl/gl_projectionmatrix.html – HPP

Antwort

-1

Ich habe es nicht ausprobiert mich, aber meine Vermutung ist, dass da Sie die Textur verwenden in einem rechteckigen Raumkoordinaten, es Verzerrung bei einer Drehung ohne einen Faktor verursacht zu korrigieren es.

Sie müssen eine Uniform übergeben, die die Breite und Höhe Ihrer Textur angibt. Damit können Sie das Seitenverhältnis anwenden, um die Verzerrung zu korrigieren.

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

kann sich so etwas wie:

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

Wie ich aber schon sagte, ich habe es nicht ausprobiert, aber ich habe diese für ähnliche Shadern in der Vergangenheit zu tun hatte. Möglicherweise müssen Auflösung.x/Auflösung.y umgekehrt werden.

2

Die folgende Codezeile, die in der Frage zur Verfügung gestellt wurde:

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

ist nicht ganz richtig. Es gibt einige Belichtungsfehler.

Die richtige Version wäre:

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

Das funktionierte gut für mich, danke! – Hobbes