2010-07-08 8 views
0

Dans mon prochain projet, j'essaie d'apprendre JOGL. Le résultat devrait être une simple animation 2D.Taille de la texture lors de l'utilisation de JOGL

J'ai entendu dire qu'une texture doit avoir une taille de 2^n * 2^n. Puis-je toujours utiliser des images qui n'ont pas cette taille, ou dois-je éditer toutes les images à l'avance? De quoi dois-je m'occuper quand j'utilise de telles textures? Par exemple, je veux montrer une sorte de barre de progression, dont l'image est à la taille de 1024 * 96px. Dois-je définir un quad (par exemple 1024 * 1024 en taille si vous calculez les pixels) et utiliser l'alpha blending pour afficher uniquement la partie "remplie"? Ou sont la texture coordonne le chemin à parcourir?

[Modifier] Works, solution ressemble à ceci (en utilisant la projection orthogonale):

@Override 
public void init(GLAutoDrawable drawable) { 
    GL gl = drawable.getGL(); // get GL 
    glu = new GLU(); 
    //... 
    t = load(".\\TEXTURES\\ProgressBarBG.png"); 
      //... 
} 

    public Texture load(String fileName){ 
    Texture text = null; 
    try{ 
     text = TextureIO.newTexture(new File(fileName), false); 
     text.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); 
     text.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
     System.out.println("Error loading texture " + fileName); 
    } 
    return text; 
} 

    private void drawProgressBG(GL gl, int z) { 

    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 

    gl.glEnable(GL.GL_BLEND); 
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glEnable(GL.GL_ALPHA_TEST); 
    gl.glAlphaFunc(GL.GL_GREATER, 0); // only render if alpha > 0 

    // don't show source alpha parts in the destination 
    gl.glEnable(GL.GL_TEXTURE_2D); 

    TextureCoords tc = t.getImageTexCoords(); 

    t.enable(); 
    t.bind(); 


    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, 
      GL.GL_REPLACE); 

    gl.glBegin(GL.GL_QUADS); 

    gl.glTexCoord2f(tc.left(), tc.bottom()); gl.glVertex3f(0f, 0f, z); 
    gl.glTexCoord2f(tc.right(), tc.bottom()); gl.glVertex3f(1024f, 0f, z); 
    gl.glTexCoord2f(tc.right(), tc.top()); gl.glVertex3f(1024f, 96f, z); 
    gl.glTexCoord2f(tc.left(), tc.top()); gl.glVertex3f(0f, 96f, z); 

    gl.glEnd(); 

    gl.glDisable(GL.GL_TEXTURE_2D); 
    // switch back to modulation of quad colours and texture 
    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, 
    GL.GL_MODULATE); 
    gl.glDisable(GL.GL_ALPHA); // switch off transparency 
    gl.glDisable(GL.GL_BLEND); 


    gl.glPopMatrix(); 

} 

[/ EDIT]

Répondre

0

Je ne pense pas qu'il doit être 2^n plus. Vous pouvez le tester facilement nehe.gamedev.net a de grands tutoriels opengl et certains également en JOGL. Utiliser seulement 9% de votre texture 1024 * 1024 est une grosse perte de RAM vidéo. Tu ferais mieux de l'éditer. Utilisez les coordonnées de texture si vous avez seulement besoin d'une partie de votre texture, c'est pourquoi nous les avons.

+0

Oui, à mon avis c'est une vraie perte de RAM (et HDD) - Voilà pourquoi j'ai posé cette question :) - Je vais jeter un oeil à votre lien – Elvith

+0

Je l'ai eu en utilisant la texture px 1024x96 - thx! En plus de votre lien, j'ai trouvé celui-ci très utile: http://fivedots.coe.psu.ac.th/~ad/jg2/ch16/jogl2.pdf – Elvith