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 :

Utilisation des textures 2D en Java, avec JOGL2.3


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2019
    Messages : 18
    Par défaut Utilisation des textures 2D en Java, avec JOGL2.3
    Bonjour,

    Je développe des jeux vidéo en Java depuis quelques années et aujourd'hui je passe à OpenGL. J'ai hésité entre LWGJL et JOGL et ai finalement choisis le second pour sont côté objets.

    J'aimerais dessiner les textures de mon jeux avec OpenGL, mais j'ai des difficulté à utilisé ce nouvel outils. Je voudrais charger une image, la mettre en tampon dans la carte graphique et l'utiliser quand j'en ai besoin. J'ai écumé les le net pour trouver un exemple de base de ce code dans un programme en fonctionnement mais je n'ai rien trouvé.
    La plupart des tutoriels sur OpenGL présupposent qu'on sait déjà depuis longtemps comme afficher une bête image 2D ou alors s’appuient sur une autre librairie ou un autre langage.

    Auriez vous un bout de code à m'indiquer ou à me filer ?

    Petite précision, ce code ci ;
    (Tex encapsule la bufferedImage ainsi que la texture)

    Code java : 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
     
    	public void drawTexture(Tex t, int xx, int yy, int width, int height) {
    		//if(t == null) return;
    		setColor(255, 255, 255);
    		//drawRect(xx, yy, width, height);
     
    		gl.glColor4f(r, g, b, a);
     
    		yy = (-yy)+h-height;
    		xx--;
     
    		Texture tex = t.getTexture();
     
    		if(tex == null) return;
     
    		gl.glBindTexture(GL2.GL_TEXTURE_2D, tex.getTextureObject());
    		tex.enable(gl);
     
    		gl.glBegin(GL2.GL_QUADS);
    		setColor(255, 255, 255);
    		gl.glTexCoord2f(0, 1);
    		gl.glVertex2f(xx, yy);
     
    		gl.glTexCoord2f(1, 1);
    		gl.glVertex2f(xx+width, yy);
     
    		gl.glTexCoord2f(1, 0);
    		gl.glVertex2f(xx+width, yy+height);
     
    		gl.glTexCoord2f(0, 0);
    		gl.glVertex2f(xx, yy+height);
    		gl.glEnd();
    		gl.glFlush();
     
    		gl.glBindTexture(GL2.GL_TEXTURE_2D, 0);
    	}

    Le jeux ram beaucoup, et je sais que mon morceau de code n'est pas au top, je suis sur qu'il y à une meilleure façon de faire.

    Merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Si le Texture tex = t.getTexture(); provoque le chargement de la texture (à partir du disque), alors il devient évident que cela rame.
    De plus, vous utilisez du OpenGL 1.X, qui est maintenant obsolète (toutefois, cela n'explique pas les ralentissements).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2019
    Messages : 18
    Par défaut
    Voici la méthode getTexture ;

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Texture getTexture() {
    		if(buf == null) 
    			return null;
     
    		if(texture == null) 
    			texture = AWTTextureIO.newTexture(Game.glcanvas.getGLProfile(), buf, true);
     
    		return texture;
    	}


    Mais finalement je suis passé à LWJGL 3, y à un peut plus de documentation et d'explications, bien que le contexte statique soit rebutant.

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Janvier 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Russie

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 25
    Par défaut Bonjour
    Bonjour,
    Que ce soit LWJGL ou JOGL, je pense que le code de la partie OpenGL doit être presque identique. Il y a un exemple en C, mais c'est assez compréhensible. J'ai appris les bases de OpenGL du tutorial qui est vraiment bon:
    https://www.opengl-tutorial.org/fr/b...textured-cube/

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2019
    Messages : 18
    Par défaut
    Le code entre JOGL et LWJGL est quasiment identique, à de rares exception près, et c'est sur ce dernier point que j'ai bloqué.

    Avec LWJGL j'ai réussis à faire ce que je voulais, à savoir charger une texture dans la carte graphique et la dessiner via un id ;

    Code java : 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
    	public static Texture load(BufferedImage buf) {
    		int w = buf.getWidth();
    		int h = buf.getHeight();
     
    		System.err.println(w + "," + h + "    " + buf.getType() + "   " + buf);
     
    		int[] pixels = new int[w * h];
    		buf.getRGB(0, 0, w, h, pixels, 0, w);
     
    		ByteBuffer buffer = BufferUtils.createByteBuffer(w * h * 4);
     
    		for(int y = 0; y < h; y++) {
    			for(int x = 0; x < w; x++) {
    				if(x + y * w >= pixels.length) break;
     
    				int i = pixels[x + y * w];
     
    				buffer.put((byte) ((i >> 16) & 0xFF));
    				buffer.put((byte) ((i >> 8) & 0xFF));
    				buffer.put((byte) ((i) & 0xFF));
    				buffer.put((byte) ((i >> 24) & 0xFF));
    			}
    		}
     
    		buffer.flip();
     
    		int id = glGenTextures();
     
    		glBindTexture(GL_TEXTURE_2D, id);
     
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     
    		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
     
    		Texture t = new Texture(w, h, id);
     
    		return t;
    	}

    et ;

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	public static void render(Texture t, int x, int y, int w, int h) {
    		glBindTexture(GL_TEXTURE_2D, t.id);
     
    		glBegin(GL_QUADS);
    			glColor4f(1f, 1f, 1f, 1f);
    			glTexCoord2f(0, 0); glVertex2f(x, y);
    			glTexCoord2f(1, 0); glVertex2f(x + w, y);
    			glTexCoord2f(1, 1); glVertex2f(x + w, y + h);
    			glTexCoord2f(0, 1); glVertex2f(x, y + h);
    		glEnd();
     
    		glBindTexture(GL_TEXTURE_2D, 0);
    	}

    Si jamais ce code peut servir...

    Maintenant j'avance sur monde programme et le sujet est résolu !

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    Salut !

    Débuter OpenGL (API en obsolescence) par une version qui est obsolète depuis 20 ans, je trouve ça inutile, quand même.
    Tu ne vas rien connaître de l'utilisation efficace d'OpenGL (sans parler des API modernes), et tu vas être vite limité par le pipeline fixe.

    Suis un cours d'OpenGL moderne, à part le fait qu'ils soient en C ou en C++, les concepts OpenGL abordés seront valables en Java (quelle que soit la lib utilisée).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Utilisation des ports COM en Java avec RXTX
    Par philippe57460 dans le forum Général Java
    Réponses: 13
    Dernier message: 02/02/2010, 12h18
  2. Utiliser des Objets PHP en Java
    Par nako dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 09/05/2007, 14h05
  3. [SimpleXML] Est-il possible d'utiliser des expressions XPATH 2.0 avec simplexml ?
    Par ANISSS dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/11/2006, 09h14
  4. Problème d'utilisation des attributs width et height avec une image distante
    Par Ptit_Mouss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/09/2006, 15h40

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