2016-12-01 2 views
0

Je convertis png en textures sur le côté java et les dessine sur des positions personnalisées sur l'écran en surface 2D. Dans mon cas, le point 0,0 est le coin supérieur gauche de l'écran. Le coin inférieur droit est par exemple 1024x768. Maintenant, je veux mettre en œuvre quelque chose comme ImageView avec effet de défilement. Cela signifie que pendant le défilement, certaines textures ne seront visibles que partiellement. Par exemple, les textures du haut (les éléments du haut) manqueront les textures du haut et du bas (les éléments du bas).OpenGL ES 2.0 - comment dessiner seulement une partie de la texture avec les shaders?

J'utilise vertex shaders standard et fragment:

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; 
} 

Disons que mon ImageView est légèrement défilée et je ne vois que 70% de la hauteur des meilleures textures des objets? Les premiers 30% devraient être invisibles. Comment puis-je modifier le vertex ou le fragment shader?

J'utilise OpenGL2.0

Merci

Répondre

1

Deux façons de mettre en œuvre ceci:

(1) ont un rectangle surdimensionné qui représente toute la texture, et changer le gl_Position émis par le sommet shader pour fournir le défilement. Pensez à déplacer physiquement le rectangle de haut en bas dans l'espace 3D, et vous aurez l'idée.

La zone située entre les coordonnées -1 et +1 dans l'espace-clip (la sortie du vertex shader) est visible. Par exemple. Si vous voulez que les 50% du milieu soient visibles et remplissent tout l'écran (en coupant le haut et le bas de 25%), vous devez alors émettre le quad de texture avec les coordonnées +2 à -2. Les parties situées à l'extérieur de l'espace-clip visible (+1 -> +2 et -2 -> -1) seront simplement tronquées. (2) Maintenez le même rectangle à l'écran et modifiez les coordonnées de texture v_texCoord émises par le vertex shader. Dans ce cas, vous voulez réduire les valeurs pour fournir la baisse. Les coordonnées entre 0.0 et 1.0 représentent la texture entière, donc si vous voulez couper les 30% que vous voulez utiliser (0.3 à 1.0) ou (0.0 à 0.7) selon votre définition de "top".

+0

La deuxième voie sonne mieux pour mes fins. Je pense que je sais comment le faire et je vais l'essayer sur un exemple simple. Je crois que ce thème pourrait être intéressant pour beaucoup de gens, donc si quelqu'un expérimenté peut ajouter un exemple simple, je serai très heureux. Merci beaucoup. – user1063364