2016-12-01 3 views
0

Ich konvertiere Png in Texturen auf Java-Seite und zeichne sie auf benutzerdefinierten Positionen auf dem Bildschirm in 2D-Oberfläche. In meinem Fall ist der Punkt 0,0 oben links im Bildschirm. Die untere rechte Ecke ist zum Beispiel 1024x768. Jetzt möchte ich etwas wie ImageView mit Scrolling-Effekt implementieren. Dies bedeutet, dass beim Scrollen einige Texturen nur teilweise sichtbar sind. Zum Beispiel werden obere Texturen (obere Elemente) den oberen Teil und untere Texturen (untere Elemente) den unteren Teil verpassen.OpenGL ES 2.0 - Wie zeichne ich nur einen Teil der Textur mit Shadern?

Ich benutze Standard Vertex- und Fragment-Shader:

precision mediump float; 
varying vec2 v_texCoord; 
uniform sampler2D s_texture; 

void main() 
{ 
    gl_FragColor = texture2D(s_texture, v_texCoord); 
} 
//------------ 
uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 
attribute vec2 a_texCoord; 
varying vec2 v_texCoord; 

void main() 
{ 
    gl_Position = uMVPMatrix * vPosition; 
    v_texCoord = a_texCoord; 
} 

Lassen Sie sagen, mein Image etwas gescrollt wird, und ich sehe nur 70% der Höhe der Top-Artikel Texturen? Die ersten 30% sollten unsichtbar sein. Wie kann ich den Vertex- oder Fragment-Shader ändern?

Ich benutze OpenGL ES 2.0

Danke

Antwort

1

zwei Möglichkeiten, dies zu implementieren:

(1) Gibt ein übergroßes Rechteck, das die gesamte Textur darstellt und die gl_Position vom Scheitelpunkt emittiert ändern Shader, um die Schriftrolle bereitzustellen. Stellen Sie sich vor, Sie bewegen das Rechteck im 3D-Raum auf und ab, und Sie erhalten die Idee.

Die Region zwischen den Koordinaten -1 und +1 im Clip-Space (die Ausgabe vom Vertex-Shader) ist sichtbar. Z.B. Wenn Sie möchten, dass die mittleren 50% der Textur sichtbar sind und den gesamten Bildschirm ausfüllen (25% oben und unten abschneiden), dann würden Sie den Textur-Quadranten mit den Koordinaten +2 bis -2 ausgeben. Die Teile außerhalb des sichtbaren Clip-Bereichs (+1 -> +2 und -2 -> -1) werden einfach abgeschnitten.

(2) Halten Sie das Rechteck auf dem Bildschirm gleich groß und ändern Sie die vom Vertex-Shader ausgegebenen Texturkoordinaten v_texCoord. In diesem Fall möchten Sie die Werte reduzieren, um den Drop bereitzustellen. Koordinaten zwischen 0.0 bis 1.0 repräsentieren die gesamte Textur, also wenn Sie die oberen 30% abschneiden möchten, die Sie verwenden möchten (0.3 bis 1.0) oder (0.0 bis 0.7) abhängig von Ihrer Definition von "top".

+0

Der zweite Weg klingt besser für meine Zwecke. Ich denke, ich weiß, wie es geht, und ich werde es an einem einfachen Beispiel versuchen. Ich glaube, dass dieses Thema für viele Leute interessant sein könnte, wenn jemand ein einfaches Beispiel hinzufügen kann, werde ich sehr glücklich sein. Danke vielmals. – user1063364