IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

JOGL - texture


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut JOGL - texture
    Salut tout le monde,

    Je reste coincé depuis qq tps sur la texture d'un cube.
    En effet l'image affiché est dégradé, affichage de petit carré coloré rouge, vert, bleu. Je ne sais pas faire de capture d'écran sur mac.

    Pour cela j'utilise la methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    private void makeRGBTexture(GL gl, GLU glu, BufferedImage img, int target, boolean mipmapped)
    	{
    		ByteBuffer dest = null;
    		switch (img.getType())
    		{
    		case BufferedImage.TYPE_3BYTE_BGR:
    		case BufferedImage.TYPE_CUSTOM:
    		{
    			logger.debug("Custom");
    			byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
    			dest = ByteBuffer.allocateDirect(99999);
    			dest.order(ByteOrder.nativeOrder());
    			dest.put(data, 0, data.length);
    			break;
    		}
    		case BufferedImage.TYPE_INT_RGB:
    		{
    			logger.debug("Int RGB");
    			int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    			dest = ByteBuffer.allocateDirect(data.length * BufferUtil.SIZEOF_INT);
    			dest.order(ByteOrder.nativeOrder());
    			dest.asIntBuffer().put(data, 0, data.length);
    			break;
    		}
    		default:
    			throw new RuntimeException("Unsupported image type " + img.getType());
    		}
     
    		if (mipmapped)
    		{
    			logger.debug("mipmapped");
    			glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, dest);
    		}
    		else
    		{
    			logger.debug("image2D");
    			gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, dest);
    		}
    	}
    Je pense que le soucis viens d'un parametrage dans le code ci dessus.

    J'indique le code appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    URL url = getResource(texture);
    			if (url == null)
    			{
    				throw new RuntimeException("Error reading resource " + texture);
    			}
    			BufferedImage img = ImageIO.read(url);
    			logger.debug("toto "+url.getPath());
    			keys.add(texture);
    			storageTextures.add(new int[1]);
     
    			//gl.glGenTextures(1, storageTextures.get(keys.size()-1), keys.size()-1);
     
    			makeRGBTexture(gl, new GLU(), img, GL.GL_TEXTURE_2D, true);
     
    			gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);
    			gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
    dans ma methode init :
    GL.glEnable(GL.GL_TEXTURE_2D);


    Ensuite pour le display :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    gl.glEnable(GL.GL_TEXTURE_2D);
     
    			gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
    			gl.glDisable(GL.GL_TEXTURE_GEN_S);
    			gl.glDisable(GL.GL_TEXTURE_GEN_T);
    			gl.glBindTexture( GL.GL_TEXTURE_2D, indexTexture);
     
     
    			gl.glBegin(GL.GL_POLYGON);
    ...
    gl.glDisable(GL.GL_TEXTURE_2D);
    Avez vous deja rencontré ce pb ?
    Comment le corrigé ?

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    Re, en essayant une autre technique j'ai finalement reussi à afficher ma texture. Cependant, je pense que ma technique n'est pas terrible.

    Mon loader de texture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    package org.yll.moteurOpenGL.outils.texture;
     
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.media.opengl.GL;
    import javax.media.opengl.GLException;
     
    import org.apache.log4j.Logger;
     
    import com.sun.opengl.util.texture.Texture;
    import com.sun.opengl.util.texture.TextureIO;
     
    public class TextureLoader {
     
    	private static final String PATH_TEXTURE = "data/images/";
     
    	private static Logger logger 	= 	Logger.getLogger(TextureLoader.class.getName());
     
    	private final Map<String, Texture> 	textures;
    	private final List<String> 		    keys;
    	private final List<int[]> 			storageTextures;
     
    	private static TextureLoader 	textureLoader;
     
    	private TextureLoader(){
    		textures 		= new HashMap<String, Texture>();
    		keys 			= new ArrayList<String>();
    		storageTextures = new ArrayList<int[]>();
    	}
     
    	public static TextureLoader getTextureLoader(){
     
    		if(null==textureLoader){
    			logger.info("init new TextureLoader");
    			textureLoader = new TextureLoader();
    		}
     
    		return textureLoader;
    	}
     
    	public Texture getTexture(String texture) {
    		return textures.get(texture);
    	}
     
    	public int getIndexTexture(String texture) {
    		return keys.indexOf(texture);
    	}
     
    	public Texture loadTexture(GL gl, String texture) {
    		if(textures.containsKey(texture)){
    			logger.debug("texture "+texture+" already loaded index "+getIndexTexture(texture));
    			return getTexture(texture);
    		}
     
    		logger.info("start loading texture : "+texture);
    		String fileName = TextureLoader.PATH_TEXTURE + texture;
    		try {
    			File file = new File(fileName);
    			Texture text = TextureIO.newTexture(file, true);
     
    			textures.put(texture, text);
    			keys.add(texture);
    			storageTextures.add(new int[1]);
     
    			// inutile pour le moment
    			//gl.glGenTextures(1, storageTextures.get(keys.size()-1), keys.size()-1);
    			gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);
    			gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
     
    			logger.info("Texture estimated memory size = " + text.getEstimatedMemorySize());
    			logger.info("Texture width = " + text.getWidth());
    			logger.info("Texture height = " + text.getHeight());
    			logger.info("Texture index : "+getIndexTexture(texture));
    			logger.info("keys : "+keys);
     
    		}
    		catch(GLException e){
    			logger.error("Error loading texture " + fileName, e);
    			return null;
    		}
    		catch(Exception e) {
    			logger.error("Error loading texture " + fileName, e);
    			return null;
    		}
     
    		return getTexture(texture);
    	}
     
    }
    La methode init de JOGL contient la ligne suivante pour la gestion des textures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GL.glEnable(GL.GL_TEXTURE_2D);
    La methode diplay de JOGL dessine un polygone compose de plusieurs faces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // Gestion des textures
    			gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
    			gl.glDisable(GL.GL_TEXTURE_GEN_S);
    			gl.glDisable(GL.GL_TEXTURE_GEN_T);
    			//gl.glBindTexture( GL.GL_TEXTURE_2D, indexTexture);
    			texture.enable();
    			texture.bind();
     
     
     
    			//gl.glRotatef(compteur,0.0f,1.0f,0.0f);
    			for(CFace face : faces){
    				gl.glBegin(GL.GL_TRIANGLES);
    				//gl.glBegin(GL.GL_POLYGON);
    				face.dessine(gl);
    				gl.glEnd();
    			}
     
    			texture.disable();
    			gl.glDisable(GL.GL_TEXTURE_2D);
    Je pense que cette méthode n'est pas la plus récente et qu'il est preferable d'utiliser celle avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGenTextures(1, &texName);
    . Qui parmi vous peux m'indiquer la methode pour mieux gerer les ressources ???

    Est celle de mon premier post ?
    Je peux envoyer mon code si ça peut pour aider pour mieux m'aider

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    ok en revenant sur le première technique et e initialisant correctement j(obtiens désormais l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    [ERROR] TextureLoader_old - Error loading texture data/images/box3_map.png
    javax.media.opengl.GLException: glGetError() returned the following error codes after a call to glGetString(): GL_INVALID_ENUM 
    	at javax.media.opengl.DebugGL.checkGLGetError(DebugGL.java:12715)
    	at javax.media.opengl.DebugGL.glGetString(DebugGL.java:4211)
    	at com.sun.opengl.impl.FunctionAvailabilityCache.initAvailableExtensions(FunctionAvailabilityCache.java:116)
    	at com.sun.opengl.impl.FunctionAvailabilityCache.isExtensionAvailable(FunctionAvailabilityCache.java:104)
    	at com.sun.opengl.impl.GLContextImpl.isExtensionAvailable(GLContextImpl.java:351)
    	at com.sun.opengl.impl.macosx.MacOSXGLContext.isExtensionAvailable(MacOSXGLContext.java:337)
    	at com.sun.opengl.impl.GLImpl.isExtensionAvailable(GLImpl.java:30493)
    	at com.sun.opengl.impl.GLImpl.initBufferObjectExtensionChecks(GLImpl.java:30638)
    	at com.sun.opengl.impl.GLImpl.checkUnpackPBODisabled(GLImpl.java:30673)
    	at com.sun.opengl.impl.GLImpl.glTexImage2D(GLImpl.java:21145)
    	at org.yll.moteurOpenGL.outils.texture.TextureLoader_old.makeRGBTexture(TextureLoader_old.java:166)
    	at org.yll.moteurOpenGL.outils.texture.TextureLoader_old.loadTexture(TextureLoader_old.java:86)
    	at org.yll.moteurOpenGL.structure.group.CSolide.setGlobalTexture(CSolide.java:229)
    	at org.yll.moteurOpenGL.scene.CSceneDebug.miseEnPlace(CSceneDebug.java:61)
    	at org.yll.moteurOpenGL.scene.AScene.init(AScene.java:199)
    	at com.sun.opengl.impl.GLDrawableHelper.init(GLDrawableHelper.java:72)
    	at javax.media.opengl.GLCanvas$InitAction.run(GLCanvas.java:418)
    	at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:189)
    	at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:412)
    	at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
    	at javax.media.opengl.GLCanvas.paint(GLCanvas.java:277)
    	at sun.awt.RepaintArea.paintComponent(RepaintArea.java:276)
    	at sun.awt.RepaintArea.paint(RepaintArea.java:241)
    	at apple.awt.ComponentModel.handleEvent(ComponentModel.java:268)
    	at java.awt.Component.dispatchEventImpl(Component.java:4144)
    	at java.awt.Component.dispatchEvent(Component.java:3903)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    si vous savez ce que ça veux dire, suis preneur

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    Un pti up,
    apparement pas grand monde pour m'aider sur mon erreur.

    Néanmoins savez vous quelle solution est la meilleur entre la 1* et la seconde ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Utilise la classe com.sun.opengl.util.texture.Texture au lieu de réinventer l'eau chaude. Désolé de répondre si tardivement. Je vais lire ton code source quand même.

    org.yll.moteurOpenGL.outils.texture.TextureLoader_old.makeRGBTexture(TextureLoader_old.java:166)
    Tu dois utiliser quelque chose qui n'est pas supportée sur ta machine à cette ligne. Utilises-tu des pixel buffer objects? Es-tu sous Mac OS?

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    Citation Envoyé par gouessej Voir le message
    Tu dois utiliser quelque chose qui n'est pas supportée sur ta machine à cette ligne. Utilises-tu des pixel buffer objects? Es-tu sous Mac OS?
    Je ne manipule pas directement de pixel buffer objects. Peut être indirectement via des appels gl.XXX. Oui je suis sous Mac OS, léopard (enfin le dernier mac OS).

    Autrement je cherche la méthode la plus légère en terme de ressource. Ma première idée était de stockée les textures déjà chargées et éviter de les "reloader".

    Pour infos, hier en persévérant sur la première méthode, j'ai affiché comme texture le contenu de ma page safari (j'ai réussi à lire le logo développez ...).

    PS : Gouessej, si tu as besoin je peux t'envoyer mes src au besoin.

Discussions similaires

  1. [JOGL] Effet Blur et copie d'écran en texture
    Par xion.luhnis dans le forum OpenGL
    Réponses: 12
    Dernier message: 16/05/2009, 02h04
  2. JOGL probleme de passage d'une texture a GLSL.
    Par wax78 dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/04/2009, 14h49
  3. Création de textures jogl
    Par jafar456 dans le forum OpenGL
    Réponses: 6
    Dernier message: 25/03/2009, 19h02
  4. JOGL et problème au chargement des textures
    Par GLDavid dans le forum OpenGL
    Réponses: 2
    Dernier message: 20/05/2008, 10h14
  5. [jogl] texturer une surface
    Par Garion dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/05/2006, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo