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 :

Différentes coordonnées textures [OpenGL 3.x]


Sujet :

OpenGL

  1. #1
    Membre actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut Différentes coordonnées textures
    Bonsoir tout le monde,

    ça fait déjà un moment que suis des tutoriels OpenGL, mais actuellement je me heurte à un problème de texture ou plus exactement celui des Texture Atlas/Sprite Sheet, jusqu'ici j'ai pu utiliser les coordonnées de mes textures (réparties dans des carrés de tailles similaires et donc facile à calculer) et ensuite les adapter à mon objet dans le Vertex-Shader sans qu'il y ait de problème, et tout cela en utilisant les mêmes vertex pour un (Quad) et ma Texture Atlas.

    Cette fois-ci j'utilise une Texture Atlas avec des des parties réparties de manière désordonnée, et c'est ça qui pose problème, je ne sais pas comment calculer ou dire à mon Shader d'assigner un groupe de données (texture coordonnées), au vertex adéquat, et ce en raison de son fonctionnement (traitement par 1 seul vertex/fragment), voici le code que j'utilise pour assigner mes coordonnées texture dans la méthode 1 :

    VAO :

    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
     
                   float[] vertex = new float[]{0,0,0,1,1,0,1,1};
                   float[] texCoords = new float[]{0,0,0,1,1,0,1,1};
     
                    int vaoId = GL30.glGenVertexArrays();
                    GL30.glBindVertexArray(vaoId);
     
    		//Créer un vbo vertex
    		int vboPos = GL15.glGenBuffers();
    		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboPos);
    		FloatBuffer bufferPos = BufferUtils.createFloatBuffer(positions.length);
    		bufferPos.put(positions);
    		bufferPos.flip();
    		GL15.glBufferData(GL15.GL_ARRAY_BUFFER, bufferPos, GL15.GL_STATIC_DRAW);
    		GL20.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0); //Index 0 dans le VAO et 2D (x,y)
    		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
     
    		//Créer un id texture atlas
                    int textureId = genTextureId(imgLoc); 
     
                    //Créer un vbo coordonnées texture (taille entière)
    		int vbotex = GL15.glGenBuffers();
    		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbotex);
    		FloatBuffer buffertex = BufferUtils.createFloatBuffer(textCoords.length);
    		buffertex.put(textCoords);
    		buffertex.flip();
    		GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffertex, GL15.GL_STATIC_DRAW);
    		GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, 0, 0); //Index 1 dans le VAO et 2D (u,v)
    		GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
     
    		GL30.glBindVertexArray(0);
    Vertex-Shader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                   gl_Position = projMatrix * transMatrix * vec4(position,0.0,1.0);
    	     //à passer_au_fragment  =  (2D) attribut coordonnées_Texture + (2D) positionXY / index texture
                          coords  =   ( texCoords  + offsetXY )  /  indexCase;
    Ma question est donc, comment utiliser différente coordonnées textures issues de la même 'Texture Atlas' et les assigner à des Quads dupliqués mais qui partagent tous les mêmes vertex ? Pour le moment j'écarte la possibilité de l'instancing (je ne suis pas encore au niveau). J'espère que ce n'est pas trop vague ou mal expliqué, j'accepte toute critique ou solution, merci pour votre aide !

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour que vos quads partagent tous les même vertex (mais pas le même sprite), il ne faut plus passer les textures de coordonnées avec les vertex (on va y revenir plus tard).
    Par contre, pour chaque quad, vous allez devoir passer au moins l'identifiant du sprite (pour qu'au rendu, vous sachiez quel sprite appliquer).
    Pour cela, vous allez passer une nouvelle données, une donnée globale aux shaders, qui représentera l'encyclopédie de vos sprites (c'est à dire, que pour un identifiant, vous êtes capable de retrouver les quatre coins du sprite). Cette "encyclopédie" peut être sous différente formes :
    • l'encyclopédie stocke pour chaque sprite, les quatres cotés du sprite dans l'atlas ;
    • l'encyclopédie stocke le point central et le taille (soit simplement une taille si tous les sprites sont carrés, soit la largeur et hauteur).


    Par contre, pour vos quads, finalement, vous devrez passer toujours les quatre coordonnées 0, 0 ; 0, 1 ; 1, 1 et 1, 0 afin que dans le shader vous sachiez si vous êtes dans le coin supérieur bas gauche, bas droite, haut gauche ou haut droite.

    Voilà comment je ferai.
    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 actif
    Avatar de guatto
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 179
    Points : 226
    Points
    226
    Par défaut
    D'abord merci pour cette réponse très bien détaillée, pour ce qui est des deux solution je me suis servi de la 2eme (celle des carrés) dans ma méthode 1, mais le problème c'est que la taille (horizontal,vertical) de mon quad varie, et donc on ne peut prévoir quelle taille aura le quad sauf en se servant des coordonnées.

    Pour être plus précis dans ma question, j'essaye d'afficher du texte qui est sur une Texture Atlas, en me servant d'un fichier (.fnt) qui contient tout les infos sur (position/taille...) des parties à l'intérieur de la texture globale.

    J'aime votre première proposition mais j'aurais juste besoin de votre opinion SVP, dois-je vérifier les coordonnées comme suit (en sachant que j'utilise une projection orthographique et des transformations et GL_TRIANGLE_STRIP comme méthode de dessin) :

    Vertex shader :

    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
     
    #version 330
     
    in vec2 position;
    in vec2 textureCoords;
     
    out vec2 pass_textureCoords;
     
    uniform mat4 transMatrix;
    uniform mat4 projMatrix;
     
    uniform vec2 coords[4]; 
     
    void main(void){
     
    	gl_Position = projMatrix * transMatrix * vec4(position, 0.0, 1.0);
     
    	if(position.x == 0 && position.y == 0){  //Top left
    		pass_textureCoords = coords[0];
     
    	}else if(position.x == 0 && position.y == 1){ //Bottom left
    		pass_textureCoords = coords[1];
     
    	}else if(position.x == 1 && position.y == 0){ //Top right
    		pass_textureCoords = coords[2];
     
    	}else if(position.x == 1 && position.y == 1){ //Bottom right
    		pass_textureCoords = coords[3];
     
    	}
     
    }
    et pour les quatre coordonnées de mon quad je les passe toujours comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    0,0,  // Top left
    0,1,  // Bottom left
    1,0,  // Top right
    1,1   // Bottom right
    Merci pour ta réponse !

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Je n'aimais pas beaucoup cette solution, à cause de cette "vérification". Sinon, ce n'est pas la position qu'il faut vérifier, mais les coordonnées de texture.
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Coordonnées texture & mipmap
    Par zenux dans le forum OpenGL
    Réponses: 10
    Dernier message: 21/02/2016, 20h34
  2. 3D Coordonnées Texture 2D et sphère, Intéractivité
    Par jolann69 dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 04/04/2008, 11h13
  3. Réponses: 6
    Dernier message: 28/11/2006, 19h12
  4. Textures résidentes et coordonnées
    Par f56bre dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 23/10/2006, 01h35
  5. Index et coordonnées de texture
    Par atalmapi dans le forum DirectX
    Réponses: 3
    Dernier message: 15/03/2005, 01h02

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