2013-09-03 5 views
0

Je veux animer un certains nombres OpenGL2.0. Pour essayer de le faire démarrer, j'ai créé une minuterie et j'essaie de changer les chiffres en fonction de la minuterie. La minuterie est configurée sur une onde sin(), donc les nombres devraient augmenter puis diminuer à nouveau. Les nombres sont sur la ligne supérieure de l'atlas de texture donc en augmentant les coordonnées de texture dans la direction x le déplace vers le nombre suivant. J'ai essayé d'utiliser le fragment shader avec if pour déplacer les coordonnées de la texture mais je n'ai pas eu de chance. Je suis sûr qu'il doit y avoir une meilleure façon de le faire.La meilleure façon d'animer les textures en OpenGL ES 2.0

Fragment Shader

char FragShader[] = 
     "precision highp float;\n" 

     "varying highp vec2 textureCoordinate;\n" 
     "uniform sampler2D Texture;\n" 
     "uniform float time;\n" 

     "void main()\n" 
     "{\n" 
     "float c1 = 0.5*sin(time)+0.5;\n" 

     "if (c1 >= 0.0 && c1 < 0.1)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.1 && c1 < 0.2)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.1, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.2 && c1 < 0.3)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.2, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.3 && c1 < 0.4)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.3, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.4 && c1 < 0.5)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.4, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.5 && c1 < 0.6)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.5, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.6 && c1 < 0.7)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.6, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.7 && c1 < 0.8)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.7, 1.0 -textureCoordinate.y);\n" 

     "elseif (c1 >= 0.8 && c1 < 0.9)" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.8, 1.0 -textureCoordinate.y);\n" 

     "else" 
     "vec2 flipped_texcoord = vec2(textureCoordinate.x+0.9, 1.0 -textureCoordinate.y);\n" 

     "vec4 colour = texture2D(Texture, flipped_texcoord);\n" 
     "gl_FragColor = colour;\n" 

     "}\n"; 
+0

Pouvez-vous expliquer l'animation désirée un peu plus? Quelle plate-forme utilisez-vous? – Clyde

+0

Oh, et qu'est-ce que tu veux dire par "n'ai pas eu de chance"? Quels résultats obtenez-vous réellement? – Clyde

+0

L'animation souhaitée sera un nombre changeant de 0 à 9 et reculer à nouveau comme l'onde sin créé par la minuterie se déplace. Avec cette configuration rien ne se passe, je reçois un écran vide, mais pas de messages d'erreur. Je sais que le minuteur, les coordonnées de texture et glFragColor fonctionnent comme je les ai testés individuellement. Cela m'amène à croire que c'est quelque chose à voir avec les déclarations if utilisées. –

Répondre

0

Ok, ce fut un correctif de base, mon 'elseif' aurait été «bien si. Juste un problème qui découle de mon manque de connaissance du codage C++.