2015-01-21 6 views
6

Próbuję obrócić teksturę w module cieniującym fragmentów, zamiast korzystać z funkcji transformacji wierzchołków i macierzy.Obracanie tekstury w module Fragment Shader w języku GLSL ES

Obrót ma oś przegubu pośrodku.

Algorytm działa poprawnie podczas renderowania w kwadracie o kształcie kwadratu, ale gdy kwadrat ma kształt prostokątny, wynik renderowania zostaje pomieszany. Ktoś może zauważyć problem?

Dziękuję

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

szukam dla niego zbyt! Czy problem został rozwiązany? – Samsy

+0

Zrobiłem to, budując matrycę do obracania poza shaderem, http://stackoverflow.com/questions/31417365/how-to-rotate-a-texture-in-a-shader-android, możesz również znaleźć to pomocne przy ustalaniu elementów matrycy, http://www.songho.ca/opengl/gl_projectionmatrix.html – HPP

Odpowiedz

-1

nie próbowałem go samodzielnie, ale wydaje mi się, że skoro używasz współrzędnych tekstury w prostokątnej przestrzeni, spowoduje to zniekształcenia po obrocie bez jakiegoś czynnika w celu skorygowania to.

Będziesz musiał podać jednolity, który deklaruje szerokość i wysokość twojej tekstury. Dzięki temu można zastosować współczynnik kształtu, aby skorygować zniekształcenie.

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

może stać się coś takiego:

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

Jak powiedziałem jednak, że nie próbowałem go, ale musiałem to zrobić w przeszłości podobnych shaderów. Może trzeba cofnąć Resolution.x/Resolution.y.

2

następujący wiersz kodu, który został dostarczony w pytaniu:

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

nie jest całkiem w porządku. Występują błędy braketingu.

Poprawna wersja to:

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

To działało świetnie dla mnie, dziękuję! – Hobbes

Powiązane problemy