2015-01-21 19 views
6

Köşe gölgelendiricisini ve matris dönüşümlerini kullanmak yerine, bir doku gölgelendiricisindeki bir dokuyu döndürmeye çalışıyorum.GLSL ES'deki bir Parça Gölgelendiricisi üzerindeki bir dokuyu döndürme

Döndürme, merkezde pivot vardır.

Algoritma, kare şeklinde bir dörtlükte işlenirken iyi çalışır, ancak dörtgen dikdörtgen bir şekle sahip olduğunda, render sonucu bozulur. Sorununu herkes anlayabilir mi?

teşekkür ederiz

o kendim denemedim, ama benim tahminim doku kullanılarak üretilmiş olmasından ötürü, düzeltmek için bazı faktör olmadan dönmesi üzerine bozulmaya neden olur dikdörtgen bir mekan koordinatlarını olmasıdır
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

! Çözüldü mü? – Samsy

+0

Bunu gölgelendirici dışında döndürmek için bir matris oluşturarak yaptım, http://stackoverflow.com/questions/31417365/how-to-rotate-a-texture-in-a-shader-android, ayrıca bunu da bulabilirsiniz matris bileşenlerini bulmak için yararlı, http://www.songho.ca/opengl/gl_projectionmatrix.html – HPP

cevap

-1

o.

Dokümanın genişliğini ve yüksekliğini bildiren bir formata geçirmeniz gerekir. Bununla, distorsiyonu düzeltmek için en boy oranını uygulayabilirsiniz. Gerçi dediğim gibi

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

, bunu denemedim ama benzer shader geçmişte bu yapmak zorunda:

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

gibi bir şey olabilir. Resolution.x/Resolution.y'yi tersine çevirmek gerekebilir.

2

söz konusu sağlandı aşağıdaki kod satırı:

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

çok doğru değil. Bazı basamaklama hataları var.

doğru versiyonu olacaktır: Ben de bunun için arıyorum

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

Bu benim için harika çalıştı, teşekkür ederim! – Hobbes