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 :

Application d'une texture à un carré [OpenGL 1.x]


Sujet :

OpenGL

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut Application d'une texture à un carré
    Bonjour à tous,

    Dans le cadre d'une implémentation logicielle du profil Safety-Critical d'OpenGL, je cherche à tester les fonctionnalités de base pour valider l'implémentation d'une part, pour pouvoir faire des analyse de performances et avoir un point de départ pour une éventuelle optimisation du code. Je me heurte aux textures que je n'arrive pas à rendre à l'écran. Avant de conclure que certaines commandes OpenGL ont été implémentées de travers, j'aimerais avoir l'avis de certains d'entre vous sur les tests, car je suis loin d'être confirmé en OpenGL.

    Ci dessous, la fonction d'initialisation et la boucle principale de mon test.

    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
     
    GLubyte Texture[64] = {
    0xFF, 0x00, 0x00, 0x00,  0xFF, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,  0xFF, 0x00, 0x00, 0x00,  0xFF, 0x00, 0x00, 0x00,
    0xFF, 0x00, 0x00, 0x00,  0xFF, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,  0xFF, 0x00, 0x00, 0x00,  0xFF, 0x00, 0x00, 0x00,
    };
     
    GLuint toto;
     
    void init_test_15 (void) {
     
    glEnable(GL_TEXTURE_2D);
    /* Bien que cela soit la valeur par défaut, je m'assure que la première texture soit la texture active */
    glActiveTexture(GL_TEXTURE0);
     
    /* Génération d'un numéro de texture */
    glGenTextures(1, &toto);
     
    /* On lit ce numéro de texture avec la texture courante */ 				
    glBindTexture(GL_TEXTURE_2D, 0);
     
    /* On crée la texture contenant l'image (damier blanc et rouge)*/
    glTexImage2D(
    		GL_TEXTURE_2D,					        //Type : texture 2D
    		0,								//Mipmap : aucun
    		GL_RGBA,						        //Couleurs : 4
    		4,								//Largeur : 4
    		4,								//Hauteur : 4
    		0,								//Largeur du bord : 0
    		GL_RGBA,						        //Format : RGBA
    		GL_UNSIGNED_BYTE,				        //Type des couleurs
    		Texture							//Addresse de l'image
    		);
     
    /* Réglage des paramètres des filtres actifs */
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    }
    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
     
    void main_test_15 (void) {
    /* Avant chaque rendu on nettoie les buffers de profondeur et de couleur, on fixe la couleur courante en gris clair */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor4f(1.0f, 1.0f, 1.0f, 0.0f);
     
    /* Dessin du carré par deux triangles en appliquant les coordonnées de textures qui devraient correspondrent...*/
    glBegin(GL_TRIANGLE_FAN);
     
    glMultiTexCoord2f(0, 0.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, 0.0f);
     
    glMultiTexCoord2f(0, 0.0f, 1.0f);
    glVertex3f(0.0f, 1.0f, 0.0f);
     
    glMultiTexCoord2f(0, 1.0f, 1.0f);
    glVertex3f(1.0f, 1.0f, 0.0f);
     
    glMultiTexCoord2f(0, 1.0f, 0.0f);
    glVertex3f(1.0f, 0.0f, 0.0f);
     
    glEnd();
    }
    Certains autres paramètres sont activés à l'initialisation comme le test de profondeur, ou la couleur par défaut de nettoyage. Ce code produit à l'écran un rectangle rouge dans le quart supérieur droit de mon écran. Le reste de l'écran est gris clair. Mon diagnostic serait alors de dire que ma texture ne prend que le premier octet de ce que je lui passe car si je change la valeur du premier octet de Texture[64], la couleur du rectangle change en fonction. Je ne sais pas ce que j'ai oublié ou mal fait pour obtenir ce résultat.

    Je suis ouvert à toute piste de résolution, j'ai parcouru je pense la plus grande partie des tutoriels, blogs et autres documents sur le sujet (textures sur formes simples) en anglais et en français mais quasiment tous utilisent des commandes telles que glTexCoord2f, non supportées par le profil implémenté. Je finirai donc par vous lister les commandes en rapport avec les textures qui sont supportées par la spécification SC :

    glActiveTexture,
    glBindTexture,
    glClientActiveTexture,
    glDeleteTextures,
    glGenTextures,
    glMultiTexCoord2f,
    glTexCoordPointer,
    glTexEnvfv,
    glTexEnvi,
    glTexImage2D,
    glTexParameteri,
    glTexSubImage2D,

    Pour plus d'info sur le profil Safety-Critical (si ça vous intéresse :-p) :
    http://www.khronos.org/registry/glsc...spec_1_0_1.pdf


    -Omalab

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 056
    Points
    219 056
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    De nombreuses erreurs sont possibles
    Soit :
    • l'upload de la texture
    • l'interpolation des coordonnées de texture (application de la texture)

    En eux même, les commandes OpenGL semblent juste. Vous pouvez normalement prendre votre programme et l'exécuter sur une implémentation OpenGL de base, pour vérifier le bon fonctionnement et la justesse des commandes.
    Après, il faut inévitablement faire en sorte que vous puissiez dumper la mémoire GPU pour voir si l'upload est correct, que vous puissiez rajouter du débogue.
    En effet, certes la spécifications donne une liste de ce qu'il faut faire, mais au début, vous êtes obligé de faire plus pour le débogue. Après, il suffit de cacher les fonctions de débogue (ou les supprimer, bien sur) en release.
    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 régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Solution finalement trouvée, dans l'exemple que j'avais posté, il semblerait que le binding était mal abordé, et que j'avais une mauvaise logique dans l'enchaînement de mes commandes. Je poste ci dessous un test qui fonctionne pour mon profil, avec la fonction d'initialisation ainsi que la fonction de test.

    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
     
    void test_26_init (void)
    {
       glClearColor(0.8f, 0.8f, 0.8f, 0.0f);
     
       /* On génère un nom de texture */      
       glGenTextures(1, indicestextures);
       /* On Sélectionne la texture TEXTURE0 comme unité de texture active */
       glActiveTexture(GL_TEXTURE0);
       /* On active le mode TEXTURE_2D */
       glEnable(GL_TEXTURE_2D);
       /* On fixe notre nom de texture sur la texture active courante*/
       glBindTexture(GL_TEXTURE_2D, indicestextures[0]);
     
       /* Chargement de la texture dans la texture dont le nom est stocké dans indicestextures[0]*/
       glTexImage2D(
          GL_TEXTURE_2D,					        
          0,										
          GL_RGBA,						        
          8,										
          16,										
          0,										
          GL_RGBA,						        
          GL_UNSIGNED_BYTE,				       
          Texture									
       );
     
       /* Paramètres de filtres */
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    }
    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
     
    void test_9 (void)
    {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
       glBindTexture(GL_TEXTURE_2D, indicestextures[0]);
     
       glBegin(GL_TRIANGLE_FAN);
     
       glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
       glVertex3f(-0.5f, -0.5f, 0.5f);               //V0
     
       glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
       glVertex3f( 0.5f, -0.5f, 0.5f);               //V1
     
       glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
       glVertex3f( 0.5f,  0.5f, 0.5f);               //V2
     
       glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
       glVertex3f(-0.5f,  0.5f, 0.5f);               //V3
     
       glEnd();
     
    }
    Merci LittleWhite pour votre aide, je marque le sujet en Résolu.

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

Discussions similaires

  1. [OpenSceneGraph] Application d'une texture
    Par DhFallen dans le forum OpenSceneGraph
    Réponses: 5
    Dernier message: 13/05/2009, 17h35
  2. [ImageMagick] Application d'une texture à des colonnes
    Par Ministar dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 10/09/2007, 14h36
  3. Charger 16x16 sur une texture 256x256
    Par Johngame dans le forum DirectX
    Réponses: 4
    Dernier message: 06/03/2004, 17h16
  4. Chargement d'une texture a partir de la mémoire
    Par logramme dans le forum DirectX
    Réponses: 6
    Dernier message: 27/01/2003, 14h57
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

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