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

Delphi Discussion :

Méthode de calcul pour fusionner une NormaMap ?


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut Méthode de calcul pour fusionner une NormaMap ?
    Bonjour,

    J'ai cherché sur la toile sans trouver un algo ou un bout de code pour une question qui me semblait simple à la base :

    Comment fusionner (comme sous OpenGL) une image NormalMap à l'image originelle ?

    Voici l’image originelle (pour test) :
    Nom : 256.jpg
Affichages : 282
Taille : 28,9 Ko

    Voici la NormalMap :
    Nom : NormalMap.jpg
Affichages : 286
Taille : 16,5 Ko

    J'ai bien essayé ceci, comme pour une lightmap, mais le résultat ne me semble pas celui qui devrait être :
    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
     
    var
      Ab, Bb, Cb: PRGBTriple;
      X, Y: integer;
    Begin
         fus.Picture.bitmap.Width  := ori.Picture.Width;
         fus.Picture.bitmap.Height := ori.Picture.Height;
     
         fus.Picture.Bitmap.BeginUpdate;
     
         for Y := 0 to ori.Picture.Height - 1 do
         begin
            Ab := PRGBTriple(ori.Picture.Bitmap.RawImage.GetLineStart(Y));
            Bb := PRGBTriple(map.Picture.Bitmap.RawImage.GetLineStart(Y));
            Cb := PRGBTriple(fus.Picture.Bitmap.RawImage.GetLineStart(Y));
     
            for X := 0 to ori.Picture.Width - 1 do
            begin
              Cb^.rgbtRed   := Trunc(Ab^.rgbtRed * (Bb^.rgbtRed / 255));
              Cb^.rgbtGreen := Trunc(Ab^.rgbtGreen * (Bb^.rgbtGreen / 255));
              Cb^.rgbtBlue  := Trunc(Ab^.rgbtBlue * (Bb^.rgbtBlue / 255));
     
              Inc(Cb);
              Inc(Bb);
              Inc(Ab);
            End;
         End;
     
         fus.Picture.Bitmap.EndUpdate;
     
         fus.Invalidate;
    A votre avis, quel est la bonne méthode ?

  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 445
    Points
    28 445
    Par défaut
    euh...qu'est ce que tu attends de la fusion d'une image et d'une normal map ?!

    ce sont deux textures utilisées pour faire un rendu avec un éclairage perpixel, mais tu ne peux pas calculer une image résultante... ?! sauf à vouloir calculer l'image éclairée sous un angle donné.

    les "couleurs" de la normal map sont en fait des vecteurs normaux à l'image pour chaque pixel, à partir d'un vecteur de lumière il est donc possible de calculer l'éclairage de chaque pixel.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Je pensait pouvoir renforcer l'impression de 3D sur un bitmap avec, en fait...

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    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 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par der§en Voir le message
    Je pensait pouvoir renforcer l'impression de 3D sur un bitmap avec, en fait...
    Tu veux parler de bump mapping ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ É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.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #5
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    En suivant ton lien, je suis tombé sur cela, est c'est exactement ce que je veux faire sur une simple image:
    Nom : a200203-17.jpg
Affichages : 240
Taille : 19,9 Ko

    Il me reste plus qu'a trouvé comment procédé.

    Si vous avez des liens sur des bouts d'algo en Pascal, je suis preneur...

  6. #6
    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 445
    Points
    28 445
    Par défaut
    voici rapidement ce que ça pourrait donner...j'ai tenté d'utilise HSL mais ce n'était pas convainquant

    comme le calcul dépend de la source d'éclairage, je l'ai rendu dynamique sur le MouseMove (il y a d'ailleurs un bug car je ne tient pas compte de la taille du TImage source dans "ax - 127"...mais c'est pas très grave)

    SoftwareNormalMapping.zip
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    1000 mercis Paul, je m'en vais tester ton code avec gourmandise

  8. #8
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Quand je vois ceci, peux-tu me si le 127 correspond a la moitié de la hauteur et de la largeur de l'image ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      Light.x := ax - 127;
      Light.y := ay - 127;
      Light.z := 255;
      Light.Normalize;
    Et que si je travaille avec une image plus grande, je dois changer cette valeur ?

  9. #9
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par der§en Voir le message
    Quand je vois ceci, peux-tu me si le 127 correspond a la moitié de la hauteur et de la largeur de l'image ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      Light.x := ax - 127;
      Light.y := ay - 127;
      Light.z := 255;
      Light.Normalize;
    Et que si je travaille avec une image plus grande, je dois changer cette valeur ?
    ben en fait peu importe, j'ai pris ces valeurs pour faire varier le vecteur source de lumière, dans ton cas je suppose que tu veux une image statique (sinon autant passer par OpenGL, le résultat sera meilleur...D'ailleurs rien n'interdit de passer par OpenGL dans tous les cas )
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    C'est ce genre de truc que tu souhaite faire :



    j'ai réalisé cette demo avec Lazarus et ma bibliothèque en cours de dev.

    Le code devrait être facilement transposable pour une utilisation avec un TBitmap ou autre. Je t'ai également mis les images que j'ai utilisée

    Les images etant assez grosse je les mets ici

    Nom : bump_diffuseOriginal02.png
Affichages : 248
Taille : 1,30 MoNom : bump_heightmap02.png
Affichages : 232
Taille : 934,8 Ko
    Nom : bump_metallic.png
Affichages : 233
Taille : 224,9 KoNom : bump_normmap01.jpg
Affichages : 221
Taille : 227,3 Ko
    Nom : phongmap.png
Affichages : 218
Taille : 93,6 Ko

    A+

    Bump.zip
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  11. #11
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Merci pour le code, je vais tacher d'en extraire, la partie qui m’intéresse

  12. #12
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par der§en Voir le message
    Merci pour le code, je vais tacher d'en extraire, la partie qui m’intéresse
    elle n'est pas dedans

    par contre BeanzMaster, tu peux peut-être compléter ou corriger mon code sur le calcul de la couleur d'un pixel d'après la normal map et un vecteur de lumière normalisé.

    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
     
    type
      TVector = record
        x, y, z: Single;
        procedure Normalize;
      end;
     
    procedure TVector.Normalize;
    var
      L: Single;
    begin
      L := Sqrt(x * x + y * y + z * z);
      x := x / L;
      y := y / L;
      z := z / L;
    end;
     
    procedure ComputePixel(var Pixel: TRGBQuad; const Normal: TRGBQuad; const Light: TVector);
    var
      dotProduct: Single;
      Vector: TVector;
    begin
      Vector.X :=  (Normal.rgbRed / 255) - 0.5;
      Vector.Y :=  (Normal.rgbGreen / 255) - 0.5;
      Vector.Z :=  (Normal.rgbBlue / 255) - 0.5;
      Vector.Normalize;
     
      dotProduct := Vector.X * Light.x + Vector.Y * Light.y + Vector.Z * Light.z;
     
      if dotProduct < 0 then
        dotProduct := 0
      else
      if dotProduct > 1 then
        dotProduct := 1;
     
      Pixel.rgbRed := Round(Pixel.rgbRed * dotProduct);
      Pixel.rgbGreen := Round(Pixel.rgbGreen * dotProduct);
      Pixel.rgbBlue := Round(Pixel.rgbBlue * dotProduct);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut
    Citation Envoyé par Paul TOTH Voir le message
    elle n'est pas dedans
    Comment ça ? si, si tout est dedans

    Citation Envoyé par Paul TOTH Voir le message
    par contre BeanzMaster, tu peux peut-être compléter ou corriger mon code sur le calcul de la couleur d'un pixel d'après la normal map et un vecteur de lumière normalisé.

    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
     
    type
      TVector = record
        x, y, z: Single;
        procedure Normalize;
      end;
     
    procedure TVector.Normalize;
    var
      L: Single;
    begin
      L := Sqrt(x * x + y * y + z * z);
      x := x / L;
      y := y / L;
      z := z / L;
    end;
     
    procedure ComputePixel(var Pixel: TRGBQuad; const Normal: TRGBQuad; const Light: TVector);
    var
      dotProduct: Single;
      Vector: TVector;
    begin
      Vector.X :=  (Normal.rgbRed / 255) - 0.5;
      Vector.Y :=  (Normal.rgbGreen / 255) - 0.5;
      Vector.Z :=  (Normal.rgbBlue / 255) - 0.5;
      Vector.Normalize;
     
      dotProduct := Vector.X * Light.x + Vector.Y * Light.y + Vector.Z * Light.z;
     
      if dotProduct < 0 then
        dotProduct := 0
      else
      if dotProduct > 1 then
        dotProduct := 1;
     
      Pixel.rgbRed := Round(Pixel.rgbRed * dotProduct);
      Pixel.rgbGreen := Round(Pixel.rgbGreen * dotProduct);
      Pixel.rgbBlue := Round(Pixel.rgbBlue * dotProduct);
    end;
    Je n'avais pas vu ton code Paul
    Je vais y jeter un oeil et le fusionner avec le mien, plus quelques explications en commentaire sur l'algo

    Merci
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  14. #14
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut

    Comment ça ? si, si tout est dedans

    Jérôme
    ben je sais pas, Lazarus me dit qu'il manque les paquets bzscene_rt et bzscene_image_rt qui ne sont pas dans le ZIP et que je ne trouve pas par ailleurs...je suppose que c'est le code sur lequel tu bosses non ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ben je sais pas, Lazarus me dit qu'il manque les paquets bzscene_rt et bzscene_image_rt qui ne sont pas dans le ZIP et que je ne trouve pas par ailleurs...je suppose que c'est le code sur lequel tu bosses non ?
    Oui effectivement, les paquets ne sont pas présent. Je pensais que tu parlais du code pour générer le bump. Et tu supposes bien, c'est bien la bibliothèque que je développe depuis un petit moment déja.
    Je m'en suis d'ailleurs servie a l'occasion de la Game Jam organisée par LittleWhite ici sur DVP : https://www.developpez.net/forums/d2...e-edition-dvp/
    Malheureusement est elle bien trop grosse pour tenir dans le zip sur le forum.
    Dès que j'aurais peaufiner encore un peu je rendrais le code source disponible sur Github
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  16. #16
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    La réponse qu'attends Paul, m’intéresse aussi beaucoup

  17. #17
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Joli travail BeanzMaster

    Pour info, il y a toujours les très bons exemples Delphi/OpenGL de Jan Horns (http://www.sulaco.co.za). De mémoire, il y a un exemple de bumpmapping.
    Il y a aussi ce petit tuto (en allemand) : https://wiki.delphigl.com/index.php/Tutorial_BumpMap.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. [XL-2010] Macro pour fusionner une sélection
    Par xuan203 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/07/2017, 07h43
  2. Réponses: 2
    Dernier message: 10/03/2013, 13h45
  3. Réponses: 3
    Dernier message: 03/05/2010, 12h40
  4. Methode simple pour modifier une image
    Par arsenik7 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 02/02/2006, 08h22
  5. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16

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