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

Langage Delphi Discussion :

Delphi opengl : Probleme d'initialisation texture


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Delphi opengl : Probleme d'initialisation texture
    Bonjour,
    Je suis relativement nouveau sur opengl, et je viens tout juste de commencer à toucher les textures, alors je pense que ma question est peut-être bête.. En tout cas, je n'ai pas trouvé précisément ce que je cherchais sur les forums.


    En fait, je cherche à initialiser une texture qui contiendra l'ensemble de l'écran, et j'aimerais que ce soit possible sans que ses dimensions soient de la forme 2^n, vu que sa taille dépendra de la résolution de l'écran.
    Bizarrement, le code ne plante pas pour une TailleX de 121 et une TailleY de 91 : ces dimensions correspondent à une résolution de 4/3.
    Pour le 16/9 par contre, j'ai un TailleX de 161 et un TailleY toujours à 91 (je le garde fixe), et là, le code plante.
    Voilà le code : ( il plante à la ligne glTexImage2D )

    T est ma texture, un record d'un identifiant et d'un tableau de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        glGenTextures(1, @T.Index);
        glEnable(GL_TEXTURE_2D);
          glBindTexture(GL_TEXTURE_2D, T.Index);
          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
          glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TailleX, TailleY, 0, GL_RGBA, GL_UNSIGNED_BYTE, @T.Donnees);
        glDisable(GL_TEXTURE_2D);
    Je peux comprendre que ça plante si la texture est sensée avoir des dimensions en 2^n, mais pourquoi pas dans tous les cas alors ?
    Donc si quelqu'un peut me guider sur la marche à suivre, et pourquoi le code ne plante pas dans les deux cas, je lui serait très reconnaissant, merci d'avance en tout cas

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    les dimensions en 2^n c'est pour l'OpenGL 1.x...on 2.0 ce n'est plus obligatoire.

    Quand au plantage, peux-tu préciser en quoi il consiste ? et sous quelle forme est déclarée T ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci d'avoir répondu si vite

    Pour T, voilà la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type
      TTexture = record
        Index:GLuint;
        Donnees:Array of Array of Array of GLubyte;
      end;

    En fait, j'initialise le tableau de donnees en fonction de la taille choisie de l'écran : voilà la procedure complète :


    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
    Procedure TextureInit(Var T:TTexture; TailleX, TailleY:Integer);
    Var i, j, k:integer;
    Begin
     
      { On commence par donner la taille appropriée aux données de la texture }
     
      SetLength(T.Donnees, TailleX, TailleY, 4);
     
      { Initialisation du tableau contenant les données de la texture }
     
      for i:=0 to TailleX - 1 do
      begin
        for j:=0 to TailleY - 1 do
        begin
          for k:=0 to 3 do
          begin
            T.Donnees[i, j, k] := 0;
          end;
        end;
      end;
     
      { Initialisation de la texture }
     
      glGenTextures(1, @T.Index);
      glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, T.Index);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TailleX, TailleY, 0, GL_RGBA, GL_UNSIGNED_BYTE, @T.Donnees);
      glDisable(GL_TEXTURE_2D);
     
    End;

    Pour le plantage, je n'en sais pas plus, mis à part que ça plante à glTexImage2D pour certaines tailles, j'ai un retour brutal sous Delphi, et celui-là ne m'aide pas des masses quand à la nature du crash

    Sinon, je passerais volontier à opengl 2.0, mais j'utilise SDL opengl (jedi-SDL), et il ne supporte pas d'avantage que la version 1.2 d' OGL
    J'espère pouvoir faire autrement. Merci en tout cas !

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    argh !

    un "array of array of" donne un tableau de pointeurs qui pointent sur des données...c'est la le problème

    tu dois obligatoirement faire ceci :
    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
     
    Type
      TTexture = record
        Index:GLuint;
        Donnees:Array of GLubyte; // 1ère modification
      end;
     
    Procedure TextureInit(Var T:TTexture; TailleX, TailleY:Integer);
    Var i, j, k:integer;
    Begin
     
      { On commence par donner la taille appropriée aux données de la texture }
     
      SetLength(T.Donnees,  4 * TailleX * TailleY); // 2ième modif
     
      { Initialisation du tableau contenant les données de la texture }
      FillChar(T.Donnees[0], 4 * TailleX * TailleY , 0); // plus simpe :)
     
      { Initialisation de la texture }
     
      glGenTextures(1, @T.Index);
      glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, T.Index);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
        glTexImage2D(
         GL_TEXTURE_2D, 0, GL_RGBA, TailleX, TailleY, 0, GL_RGBA, GL_UNSIGNED_BYTE,
         @T.Donnees[0] // !!! pointer sur le PREMIER élément
       ); 
      glDisable(GL_TEXTURE_2D);
     
    End;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Ouaou !!! Ca marche parfaitement comme ça, plus de crash ! Vraiment, merci beaucoup Paul, ça fait longtemps que je cherchait une solution à ce problème ! (ça prouve aussi qu'on peut plus se fier à tous les tutos, malheureusement ).

    Sinon, je ne voudrais pas abuser de votre temps, mais j'aurait......une autre question concernant mes textures : c'est à propos du mode d'application de la texture.

    Effectivement, j'utilise GL_REPLACE, qui marche bien avec les cartes NVIDIA, mais j'ai remarqué qu'avec ATI, ça donnait soit de l'écran blanc, soit un écran assombri (selon le modèle). J'ai donc pensé le remplacer par un GL_BLEND, utilisé avec une glBlendFunc(GL_ONE, GL_ZERO), vu que je veux écraser les données de couleurs existantes avec ma texture, et là : j'obtiens des couleurs inversés ! Encore une subtilité pour un padawan comme moi je pense
    Merci encore pour le support !

Discussions similaires

  1. SDL/Opengl : Probleme de texture avec les thread
    Par tektotodu96 dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/04/2011, 02h42
  2. [Delphi : OpenGL / SDL] Problème de textures
    Par Carrick dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2009, 14h44
  3. [opengl] probleme d artefact au placage des textures
    Par ubenz dans le forum Moteurs 3D
    Réponses: 0
    Dernier message: 07/11/2008, 13h23
  4. Initialisation texture à partir fichier
    Par SteelBox dans le forum DirectX
    Réponses: 5
    Dernier message: 23/03/2005, 15h21
  5. Delphi & OpenGL
    Par Lung dans le forum OpenGL
    Réponses: 2
    Dernier message: 30/09/2004, 09h36

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