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 :

[Multitexturing] La pratique [FAQ]


Sujet :

OpenGL

  1. #1
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut [Multitexturing] La pratique
    Bonjour à tous,
    Avant tout, je précise que j'ai lu tous les post sur le multitexturing, j'y ai appris des choses, mais j'ai encore pas mal de questions.
    J'ai aussi lu pas mal de tutos.
    • Pourquoi en ai-je besoin ?
    Dans mon jeu, j'ai une heightmap générée à partir d'une image en noir et blanc : classique.
    Mon but est d'avoir des textures en fonction de la hauteur, et le plus important, que les jointures entre ces textures soient progressives. Pour ca, j'ai besoin du multitexturing.
    • Je précises que je travaille sous Delphi. Les questions
    1. Comment utiliser concretement cette technique en delphi ? Quelles fonctions appeler lors du chargement des textures, etc...
    Ex :
    glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f);
    1. Si vous avez un tuto pour l'utilisation en plus d'une alpha map, je prend, même si j'en ai déja lu, j'arrive pas à les implémenter correctement.
    2. En fait si vous avez un exemple tout simple, minimaliste, et qui me permettrait de bien comprendre le fonctionnement du multitexturing, ca m'aiderai vraiment bcp.
    Merci à tous !

  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
    personnellement, j'ai trouvé cet exemple relativement simple et clair :
    http://www.codesampler.com/oglsrc/og...xture_blending

    c'est du C mais un portage en delphi ne devrait pas être compliqué
    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 éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Merci, ca a l'air effectivement assez simple, nickel pr bien comprendre le principe.

  4. #4
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Comment est ce que je peux traduire cela en delphi... Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            glActiveTextureARB       = (PFNGLCLIENTACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB");
            glMultiTexCoord2fARB     = (PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress("glMultiTexCoord2fARB");
            glClientActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glClientActiveTextureARB");

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il te faut utiliser la traduction de glext.h (GLext.pas), dont on a parlé il n'y a pas si longtemps (-> recherche avancée).

  6. #6
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Merci bien, je teste !

  7. #7
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    J'ai pas le GLExt.dcu.

    Bon en fait, c'est la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glActiveTextureARB( GL_TEXTURE2_ARB );
    qui me fait bugger... J'arrive pas à l'initialiser (mais est ce necessaire ?). Tout ce que je sais, c'est qu'en ne faisant rien, c'est cette ligne qui fait planter.
    Pourtant, j'ai dans mes Uses OpenGL12, et cette fonction est présente.

    Help ^^

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est une fonction associée à une extension, donc à charger dynamiquement. Donc si tu ne le fais pas normal que ça ne fonctionne pas. Il faut donc que tu arrives à faire marcher GLext. Quel est exactement le problème que tu rencontres avec GLext ?

  9. #9
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Deja merci de l'aide

    Chargée dynamiquement, c'est à dire ?

    Sinon,pour GLExt, je n'arrive tout simplement pas à avoir le.dcu...
    La réponse doit être bête mais bon...

    Thx

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Chargée dynamiquement, c'est à dire ?
    C'est à dire aller la chercher dans la DLL.

    Sinon,pour GLExt, je n'arrive tout simplement pas à avoir le.dcu...
    C'est quoi un .dcu ? Il ne suffit pas d'avoir le .pas ?

  11. #11
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Ok, c'est ce que je pensais.
    Comme ca par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure glBindTexture(target: GLEnum; texture: GLuint); Stdcall; External 'OpenGL32.dll';
    Mais elle n'est pas dans OpenGL32.dll, alors de quelle dll dois-je l'appeler ?

    Sinon, un .dcu, c'est un fichier dont delphi a besoin pour compiler. Je ne sais pas exatcement comment c'est géré, en général lorsque tu créé une nouvelle Unit, il est créé automatiquement...

  12. #12
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Un *.dcu, c'est un *.pas compilé.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  13. #13
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Juste pour te montrer le but de ma question sur le multitexturing, un petit screen du jeu que je suis en train de faire avec 4 collègues, pour un projet d'école.


  14. #14
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Citation Envoyé par Lung
    Un *.dcu, c'est un *.pas compilé.
    Ok, donc comment je fais pour complier juste le GLExt.pas ?? Un bête F9 ne marche pas evidemment.

    Merci

    ============================

    Edit : c'est bon, j'ai réussi a avoir le .dcu.
    Mais mes probs ne s'arrêtent pas la... En fait, delphi ne reconnait pas le type : PGLvoid. Vous avez une idée ?
    Thx.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Mais mes probs ne s'arrêtent pas la... En fait, delphi ne reconnait pas le type : PGLvoid. Vous avez une idée ?
    Tu as bien inclus ce qu'il faut pour OpenGL ?

  16. #16
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Ben je pense... c'est dans le GLExt.pas ce type est utilisé. Mais tous les Uses sont satisfaits...

  17. #17
    Membre éclairé Avatar de NiuAge
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Par défaut
    Bon, j'ai finalement déclaré moi même le type PGLvoid = pointer; ^^
    Ensuite j'ai regardé un peu les fonctions de GLExt, et j'ai mis ca dans mon init :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      glext_LoadExtension('GL_ARB_multitexture');
    Et ca marche ! ... mais pas du tout comme il faut ^^
    Tout est recouvert de la meme texture et je perds mass de FPS...

    C'est surement du au fait de faire ca dans la boucle :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
        glActiveTextureARB( GL_TEXTURE0_ARB );
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, g_textureID_0 );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
     
        //
        // Texture Stage 1
        //
        // Perform a linear interpolation between the output of stage 0 
        // (i.e texture0) and texture1 and use the RGB portion of the vertex's 
        // color to mix the two. 
        //
     
        glActiveTextureARB(GL_TEXTURE1_ARB );
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, g_textureID_1 );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
        glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR );
     
        //
        // Texture Stage 2
        //
        // Perform a linear interpolation between the output of stage 1 
        // (i.e texture0 mixed with texture1) and texture2 and use the ALPHA 
        // portion of the vertex's color to mix the two. 
        //
     
        glActiveTextureARB( GL_TEXTURE2_ARB );
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, g_textureID_2 );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
        glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
     
        glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB );
        glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA );
            g_fContributionOfTex1 := 1.0 - (g_fContributionOfTex0 + g_fContributionOfTex2);
     
        // Do some bounds checking...
        if g_fContributionOfTex1 < 0.0 then
            g_fContributionOfTex1 := 0.0;
        if g_fContributionOfTex1 > 1.0 then
            g_fContributionOfTex1 := 1.0;
     
        //
        // Now, lets encode the blending information into the vertex color.
        // The value set into the RGB part of the color controls the blending
        // between texture 0 and texture 1, and the alpha part of the color
        // controls the blending between textures1 and textures 2.
        //
        // Note: We use the contribution of texture 0 and 2 to infer or deduce 
        // the contribution of texture 1. We can do this because we know that the
        // total contribution of our three textures must add up to 1.0f.
        //
     
        rgbValue   := g_fContributionOfTex0 / (1.0 - g_fContributionOfTex2);
        alphaValue := 1.0 - g_fContributionOfTex2;
     
        // Do some bounds checking...
        if rgbValue < 0.0 then
            rgbValue := 0.0;
        if rgbValue > 1.0 then
            rgbValue := 1.0;
     
        if alphaValue < 0.0 then
            alphaValue := 0.0;
        if alphaValue > 1.0 then
            alphaValue := 1.0;
     
        glColor4f( rgbValue, rgbValue, rgbValue, alphaValue );
     
          glBegin(GL_QUADS);
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0.0, 0.0 );
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 0.0, 0.0);
        glMultiTexCoord2fARB( GL_TEXTURE2_ARB, 0.0, 0.0 );
          glVertex3i(x,y,z);
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0.0, 1.0 );
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 0.0, 1.0 );
        glMultiTexCoord2fARB( GL_TEXTURE2_ARB, 0.0, 1.0 );
          glVertex3i(x1, x2, x3);
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 1.0, 1.0 );
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 1.0, 1.0 );
        glMultiTexCoord2fARB( GL_TEXTURE2_ARB, 1.0, 1.0 );
          glVertex3i(x11, x12, x13);
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 1.0, 0.0 );
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 1.0, 0.0 );
        glMultiTexCoord2fARB( GL_TEXTURE2_ARB, 1.0, 0.0 );
          glVertex3i(x21, x22, x23);
          glEnd;
          Inc(arrayY,STEP_SIZE);
          end;
        arrayY := 0;
        Inc(arrayX,STEP_SIZE);
        end;
    Mais j'ai pris ce code d'un tuto, et ca marchait nickel evidemment...

Discussions similaires

  1. Bonnes pratiques de protections individuelles
    Par Community Management dans le forum Sécurité
    Réponses: 23
    Dernier message: 11/06/2024, 11h23
  2. Qui pratique la programmation spontanée ?
    Par Doloop dans le forum Débats sur le développement - Le Best Of
    Réponses: 486
    Dernier message: 11/04/2023, 19h50
  3. Multitexturing et éclairage
    Par Dranor dans le forum DirectX
    Réponses: 5
    Dernier message: 21/02/2004, 12h41
  4. [Sockets] Questions pratiques
    Par ludovic.fernandez dans le forum Réseau
    Réponses: 5
    Dernier message: 16/01/2004, 18h53
  5. Multitexturing???
    Par sebh dans le forum OpenGL
    Réponses: 2
    Dernier message: 07/12/2003, 18h23

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