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 :

Où utiliser glTexImage2D ?


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut Où utiliser glTexImage2D ?
    Bonjour,

    Je dois générer une texture à partir d'un pointeur sur un tableau de byte que l'on me passe en paramètre. Pour celà j'utilise glTexImage2D.

    Quand je fais le chargement dans initializeGL() tout ce passe bien

    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
     
     
    QWindowOGL::QWindowOGL(int timerInterval, QWidget *parent, GLvoid* texture ) : QGLWidget( parent )
    {
    	m_zoneAffichage = QRect(0,0,1080,1920);
    	m_reticule = false;
    	m_RGB = true;
    	m_rotation = true;
    	m_buffer = texture;
    	glInit();
    	m_timer = new QTimer();
    	m_timer->start(timerInterval);
    	connect( m_timer, SIGNAL(timeout()), this, SLOT(updateGL()) );
    }
     
    void QWindowOGL::loadGLTextures()
    {
     
    	glGenTextures( 1, &m_texture[0] );
    	glBindTexture( GL_TEXTURE_2D, m_texture[0] );
    	glTexImage2D( GL_TEXTURE_2D, 0, 4, 4, 4, 0, GL_RGB, GL_FLOAT, (GLvoid*)m_buffer );
    	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    }
     
    void QWindowOGL::initializeGL()
    {
    	loadGLTextures();
     
    	glEnable(GL_TEXTURE_2D);
     
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClearDepth(1.0f);
     
    	glEnable(GL_DEPTH_TEST);
    	glDepthFunc(GL_LEQUAL);
     
    }
     
     
    void QWindowOGL::paintGL()
    {
     
        glMatrixMode(GL_PROJECTION);
    		glLoadIdentity();
    		glOrtho(m_zoneAffichage.left(), m_zoneAffichage.right(), m_zoneAffichage.bottom(), m_zoneAffichage.top(), 0.1f, 10.0f);
     
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     
    	glClearColor(1.0,1.0,1.0, 1.0);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
     
    	glTranslatef(0.0f,0.0f,-5.0f);
     
    	glColor3f(1.0, 1.0, 1.0);
    	glBindTexture(GL_TEXTURE_2D, m_texture[0]);
    	glBegin(GL_QUADS);
    		glTexCoord2f(0.0f, 0.0f); glVertex2f( 0.0f,  0.0f);
    		glTexCoord2f(1.0f, 0.0f); glVertex2f( 1080.0f,  0.0f);
    		glTexCoord2f(1.0f, 1.0f); glVertex2f( 1080.0f,  1920.0f);
    		glTexCoord2f(0.0f, 1.0f); glVertex2f( 0.0f,  1920.0f);
    	glEnd();
     
    }
    Le problème c'est que mon tableau change au cours du temps, et donc que je dois régénérer ma texture au cours du temps. Pour cela je pensais appeler le glTexImage2D dans le paintGL pour que la texture soit générer "en live" mais là, je n'ai plus de texture qui s'affiche :

    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
    QWindowOGL::QWindowOGL(int timerInterval, QWidget *parent) : QGLWidget( parent )
    {
    	m_zoneAffichage = QRect(0,0,1080,1920);
    	m_reticule = false;
    	m_RGB = true;
    	m_rotation = true;
    	m_buffer = texture;
    	glInit();
    	m_timer = new QTimer();
    	m_timer->start(timerInterval);
    	connect( m_timer, SIGNAL(timeout()), this, SLOT(updateGL()) );
    }
     
    void QWindowOGL::initializeGL()
    {
    	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
     
    	glEnable(GL_TEXTURE_2D);
     
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClearDepth(1.0f);
     
    	glEnable(GL_DEPTH_TEST);
    	glDepthFunc(GL_LEQUAL);
     
    }
     
    void QWindowOGL::setTexture(GLvoid* pTexture, int width, int height, bool RGB, bool rotation)
    {
    	m_buffer = pTexture;
    	m_textureWidth = width;
    	m_textureHeight = height;
    	m_RGB = RGB;
    	m_rotation = rotation;
    }
     
    void QWindowOGL::paintGL()
    {
     
        glMatrixMode(GL_PROJECTION);
    		glLoadIdentity();
    		glOrtho(m_zoneAffichage.left(), m_zoneAffichage.right(), m_zoneAffichage.bottom(), m_zoneAffichage.top(), 0.1f, 10.0f);
     
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     
    	glClearColor(1.0,1.0,1.0, 1.0);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
     
    	glGenTextures( 1, &m_texture[0] );
    	glBindTexture( GL_TEXTURE_2D, m_texture[0] );
    	glTexImage2D( GL_TEXTURE_2D, 0, 4, 4, 4, 0, GL_RGB, GL_FLOAT, m_buffer );
     
    	glTranslatef(0.0f,0.0f,-5.0f);
     
    	glColor3f(1.0, 1.0, 1.0);
    	glBindTexture(GL_TEXTURE_2D, m_texture[0]);
    	glBegin(GL_QUADS);
    		glTexCoord2f(0.0f, 0.0f); glVertex2f( 0.0f,  0.0f);
    		glTexCoord2f(1.0f, 0.0f); glVertex2f( 1080.0f,  0.0f);
    		glTexCoord2f(1.0f, 1.0f); glVertex2f( 1080.0f,  1920.0f);
    		glTexCoord2f(0.0f, 1.0f); glVertex2f( 0.0f,  1920.0f);
    	glEnd();
    }
    Sauriez-vous s'il est possible de générer la texture "en live" comme je le veut ou est-ce impossible (et la ben je suis dans la merde )

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexImage2D( GL_TEXTURE_2D, 0, 4, 4, 4, 0, GL_RGB, GL_FLOAT, m_buffer );
    c'est pas un tableau de byte (GL_FLOAT -> GL_UNSIGNED_BYTE) ?

    edit : tu ne t'es pas trompé dans les 4ème et 5ème paramètres (width et height) ?
    une texture de 4 x 4 pixels ça me parait petit
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    Ca c'est bon, c'est mon tableau de test et il marche très bien dans le 1er cas. Ma variable m_buffer pointe sur la même chose dans les 2 cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    GLfloat data[48] = {
    	  1.0f,0.0f,0.0f, 0.0f,1.0f,0.0f, 0.0f,0.0f,1.0f, 0.0f,0.0f,0.0f,
    	  0.0f,1.0f,0.0f, 0.0f,0.0f,1.0f, 0.0f,0.0f,0.0f, 1.0f,0.0f,0.0f,
    	  0.0f,0.0f,1.0f, 0.0f,0.0f,0.0f, 1.0f,0.0f,0.0f, 0.0f,1.0f,0.0f,
    	  0.0f,0.0f,0.0f, 1.0f,0.0f,0.0f, 0.0f,1.0f,0.0f, 0.0f,0.0f,1.0f
    	  };
    Par contre, oui j'ai perdu un peu de temps au début sur les paramètres de glTexImage2D mais maintenant je suis sûr qu'ils sont bons.

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    ok alors tout semble bon de ce côté

    par contre, évites de recréer un identifiant de texture à chaque boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGenTextures( 1, &m_texture[0] );
    ne devrait pas être appelé dans paintGL

    tu devrais garder loadGLTextures tel qu'il fonctionne et ajouter juste ces 2 lignes dans paintGL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBindTexture( GL_TEXTURE_2D, m_texture[0] );
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, m_buffer );
    en préférant peut-etre glTexSubImage2D à glTexImage2D (pas certain que ça change grand chose)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    ok alors tout semble bon de ce côté

    par contre, évites de recréer un identifiant de texture à chaque boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGenTextures( 1, &m_texture[0] );
    ne devrait pas être appelé dans paintGL
    J'ai testé de mettre un glDeleteTextures avant le glGenTextures, ca ne fait rien mais ca devrait permettre d'être plus propre ?

    Citation Envoyé par shenron666 Voir le message
    tu devrais garder loadGLTextures tel qu'il fonctionne et ajouter juste ces 2 lignes dans paintGL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glBindTexture( GL_TEXTURE_2D, m_texture[0] );
    glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, m_buffer );
    en préférant peut-etre glTexSubImage2D à glTexImage2D (pas certain que ça change grand chose)
    Le problème, c'est que dans le cas normal, je n'aurait pas le pointeur à l'initialisation mais seulement lorsque le parent fera un setTexture pour indiquer le nouveau tableau (et je devrai changer la texture à chaque setTexture). De plus, comme ma fonction setTexture n'est pas une routine OpenGL, je ne peux pas y gérer le glTexImage2D (ou glTexSubImage2D). Ce qu'il faut que je crée c'est un moyen de créé une nouvelle texture à chaque nouveau tableau.



    Sinon, je viens d'essayer glTexSubImage2D et ca ne marche malheureusement pas.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 93
    Par défaut
    Je viens de résoudre mon problème mais je trouve ma méthode très brute (voir dégueux)


    J'ai gardé mon LoadTexture comme tu me l'as conseillé shenron666 et dans mon setTexture, j'ai rajouté un glInit(). Mais repasser plusieurs fois dans le InitiationGL, je trouve ca dégueulasse.

    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
    void QWindowOGL::loadGLTextures()
    {
    	if(m_buffer)
    	{
    		glDeleteTextures(1, &m_texture[0]);
    		glGenTextures( 1, &m_texture[0] );
    		glBindTexture( GL_TEXTURE_2D, m_texture[0] );
    		glTexImage2D( GL_TEXTURE_2D, 0, 4, m_textureWidth, m_textureHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)m_buffer );
    		glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    		glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    	}
    }
     
    void QWindowOGL::initializeGL()
    {
    	loadGLTextures();
     
    	glEnable(GL_TEXTURE_2D);
     
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClearDepth(1.0f);
     
    	glEnable(GL_DEPTH_TEST);
    	glDepthFunc(GL_LEQUAL);
     
    }
     
     
    void QWindowOGL::paintGL()
    {
     
        glMatrixMode(GL_PROJECTION);
    		glLoadIdentity();
    		glOrtho(m_zoneAffichage.left(), m_zoneAffichage.right(), m_zoneAffichage.bottom(), m_zoneAffichage.top(), 0.1f, 10.0f);
     
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
     
    	glClearColor(1.0,1.0,1.0, 1.0);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
     
    	glTranslatef(0.0f,0.0f,-5.0f);
     
    	glColor3f(1.0, 1.0, 1.0);
    	glBindTexture(GL_TEXTURE_2D, m_texture[0]);
    	glBegin(GL_QUADS);
    		glTexCoord2f(0.0f, 0.0f); glVertex2f( 0.0f,  0.0f);
    		glTexCoord2f(1.0f, 0.0f); glVertex2f( 1080.0f,  0.0f);
    		glTexCoord2f(1.0f, 1.0f); glVertex2f( 1080.0f,  1920.0f);
    		glTexCoord2f(0.0f, 1.0f); glVertex2f( 0.0f,  1920.0f);
    	glEnd();
     
    }
     
    void QWindowOGL::setTexture(GLvoid* pTexture, int width, int height, bool RGB, bool rotation)
    {
    	m_buffer = pTexture;
    	m_textureWidth = width;
    	m_textureHeight = height;
    	m_RGB = RGB;
    	m_rotation = rotation;
     
    	glInit();
    }
    Ca marche mais j'aimerai savoir qu'elle est votre avis sur cette méthode.

  7. #7
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Citation Envoyé par killerjeff Voir le message
    repasser plusieurs fois dans le InitiationGL, je trouve ca dégueulasse.
    je ne vois pas où tu repasses "plusieurs fois dans InitiationGL" (initializeGL ?)

    normalement, tu initialises OpenGL
    ensuite tu crées ta texture (glGenTextures)
    tout ça tu le fais une fois

    ici tu as ta boucle de rendu
    - avec glBinTexture pour sélectionner ta texture
    - et un glTexImage2D qui met à jour ta texture

    et quand tu quittes, tu as un glDeleteTextures pour libérer l'allocation faite au début de ton prog par glGenTextures

    essaies aussi de récupérer les erreurs opengl
    possible que ta boucle de rendu génère une erreur qui t'aidera à comprendre pourquoi ça ne fonctionne pas
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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