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

DirectX Discussion :

[Texture]Bug affichage de texture, qui est dépendant d'un paramètre de chargement


Sujet :

DirectX

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut [Texture]Bug affichage de texture, qui est dépendant d'un paramètre de chargement
    Bonjour, je charge un PNG de 48x48 pixels de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageInformation l_imageInformation = new ImageInformation();           
    Texture = TextureLoader.FromFile(m_device, location, 0, 0, 0, Usage.None, Microsoft.DirectX.Direct3D.Format.A8R8G8B8, Pool.Managed, Filter.None, Filter.None, 0, ref l_imageInformation);
    Je l'affiche ensuite sur un quad de la façon suivante:

    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
                m_textureVertices[0].X   = 0;
                m_textureVertices[0].Y   = 0;
                m_textureVertices[0].Tu = 0;
                m_textureVertices[0].Tv = 0;
     
                m_textureVertices[1].X   = 100;
                m_textureVertices[1].Y   = 0;
                m_textureVertices[1].Tu = 1.0;
                m_textureVertices[1].Tv = 0;
     
                m_textureVertices[2].X   = 0;
                m_textureVertices[2].Y   = 100;
                m_textureVertices[2].Tu = 0;
                m_textureVertices[2].Tv = 1.0;
     
                m_textureVertices[3].X   = 100;
                m_textureVertices[3].Y   = 100;
                m_textureVertices[3].Tu = 1.0;
                m_textureVertices[3].Tv = 1.0;
     
                m_device.SetTexture(0, Texture);
                m_device.VertexFormat = CustomVertex.TransformedTextured.Format; 
                m_device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, m_textureVertices); 
                m_device.SetTexture(0, null);
    Si je dessine un rectangle,
    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
    			m_rectangleVertices[0].X = 0;
    			m_rectangleVertices[0].Y = 0;
    			m_rectangleVertices[0].Color = Color.Blue.ToArgb();
    			m_rectangleVertices[1].X = 100;
    			m_rectangleVertices[1].Y = 0;
    			m_rectangleVertices[1].Color = Color.Blue.ToArgb();
    			m_rectangleVertices[2].X = 100;
    			m_rectangleVertices[2].Y = 100;
    			m_rectangleVertices[2].Color = Color.Blue.ToArgb();
    			m_rectangleVertices[3].X = 0;
    			m_rectangleVertices[3].Y = 100;
    			m_rectangleVertices[3].Color = Color.Blue.ToArgb();
    			m_rectangleVertices[4].X = 0;
    			m_rectangleVertices[4].Y = 0;
    			m_rectangleVertices[4].Color = Color.Blue.ToArgb();
     
    			m_device.VertexFormat = CustomVertex.TransformedColored.Format;
    			m_device.DrawUserPrimitives(PrimitiveType.LineStrip, 4, m_rectangleVertices);
    Et je ne comprends pas pourquoi la texture n'occupe pas la totalité du rectangle 100x100, alors qu'elle est censé le faire.

    Le comble, c'est que quand je charge la texture de la façon suivante (avec l'option Filter.Linear plutot que Filter.None):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageInformation l_imageInformation = new ImageInformation();           
    Texture = TextureLoader.FromFile(m_device, location, 0, 0, 0, Usage.None, Microsoft.DirectX.Direct3D.Format.A8R8G8B8, Pool.Managed, Filter.Linear, Filter.None, 0, ref l_imageInformation);
    ca marche correctement !

    Idem, ca marche bien aussi si j'utilise Sprite.Draw2D(...), sans l'option Linear.
    Ca marche bien aussi si je charge un .bmp sans l'option Linear.

    une idée ?

    D'avance merci

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu peux commencer par ça :
    http://jeux.developpez.com/faq/direc...LEMES_probleme

    Et quelles sont les dimensions de ton image ?

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Salut,

    la FAQ des pbs directX est intéressante, mais n'apporte aucune réponse concernant mon cas.

    l'image fait 48x48 pixels, c'est un png, et je veux l'afficher sur un quad de 100x100

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    la FAQ des pbs directX est intéressante, mais n'apporte aucune réponse concernant mon cas
    Ca veut dire que le debug runtime ne te sort ni avertissement ni erreur ? Que le problème persiste avec le reference rasterizer ? Qu'aucune de tes fonctions DirectX n'échoue ?

    l'image fait 48x48 pixels
    Et avec une de 64x64 par exemple ?

  5. #5
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ca veut dire que le debug runtime ne te sort ni avertissement ni erreur ? Que le problème persiste avec le reference rasterizer ? Qu'aucune de tes fonctions DirectX n'échoue ?
    C'est tout à fait ca, pas d'erreurs. Du pur Lessieur.

    Alors effectivement, entre temps, j'ai fait des tests avec des textures de 32x32, 64x64 et 65x65. Et apparemment si on met Filter.None dans la fonction de chargement, il va créer une surface de taille toujours en puissance de 2, tandis qu'avec Filter.Linear il va prendre la taille exacte de l'image.

    Le problème c'est que quand on le mappe sur le quad, il tient compte de la taille de la surface et pas la taille de l'image qu'elle contient.

    Ca ne serait pas trop un problème si on avait moyen d'interroger la surface pour connaitre la taille en puissance de 2 qui lui a été affectée.

    Mais le mieux ca serait un directive qui fasse prendre en compte la taille réelle de l'image à la fonction DrawUserPrimitive.

    Bref, comment faire ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Je pense avoir le même problème avec comme différence que j'ai un vilain effet de tiling non désiré (la couche de pixel du bord droit est recopié à gauche, et même pb dans le sens vertical).
    Parcontre, le chargement en mode linéaire (comme tu l'as suggéré) ne résout pas le pb.

    est ce que tu as trouvé une solution à ton problème ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    'Alut.

    j'ai un vilain effet de tiling non désiré (la couche de pixel du bord droit est recopié à gauche, et même pb dans le sens vertical).
    N'aurais-tu pas activer le wrapping? (avec D3DRS_WRAP)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Albenejean
    N'aurais-tu pas activer le wrapping? (avec D3DRS_WRAP)
    Non, c'est bien du clamp. Et en fait je ne parvient pas à afficher correctement une texture (avec couche alpha) scalé et une texture de la taille d'une puissance de deux. J'ai aussi suivi les indications de la norme qui préconise de décaler de 0.5 la position des textures (pour que les texels soient directement mappé sur les pixels) mais sans résultat concluant.
    Est ce que tu arrives à obtenir ce que tu veux toi ?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Non, c'est bien du clamp
    Je ne parle pas de l' adressage de texture (D3DTADDRESS_xxx) mais du wrapping (D3DRS_WRAPx).

    La wrapping mappe une texture comme si elle était sur un cylindre, ce qui fait que les 1ere et derniere lignes sont filtrés ensemble (idem pour les colonnes).

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Albenejean
    Je ne parle pas de l' adressage de texture (D3DTADDRESS_xxx) mais du wrapping (D3DRS_WRAPx).

    La wrapping mappe une texture comme si elle était sur un cylindre, ce qui fait que les 1ere et derniere lignes sont filtrés ensemble (idem pour les colonnes).
    Pardon je débute

    J'ai vérifié les D3DRS_WRAPn sont tous à zéro (The default value for this render state is 0 (wrapping disabled in all directions)).

    Avec le code on y verra mieux
    J'ai tout mis en vrac.

    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
    pres.Windowed = true;
    pres.SwapEffect = SwapEffect.Discard;
    pres.BackBufferCount = 2;
    pres.BackBufferFormat = Format.Unknown; // default for windowed mode, so not needed. Oh well!
    pres.EnableAutoDepthStencil = true;
    pres.AutoDepthStencilFormat = DepthFormat.D16;
     
     
    // Set up the device's RenderStates
    device.RenderState.Lighting = false;
    device.RenderState.ShadeMode = ShadeMode.Gouraud;
    device.RenderState.ZBufferEnable = false;
    device.RenderState.CullMode = Cull.None;
    device.RenderState.FillMode = FillMode.Solid;
     
     
    device.RenderState.Lighting = false;
    device.RenderState.SourceBlend = Blend.SourceAlpha;
    device.RenderState.DestinationBlend = Blend.InvSourceAlpha;
    device.RenderState.AlphaBlendEnable = true;
     
    //Set texture pipeline with parameters for masked texture
    //  Layer 0 is alpha part
    //  Layer 1 is color part
    device.TextureState[0].ColorOperation = TextureOperation.SelectArg2;
    device.TextureState[0].ColorArgument2 = TextureArgument.Diffuse;
    device.TextureState[0].AlphaOperation = TextureOperation.Modulate;
    device.TextureState[0].AlphaArgument1 = TextureArgument.TextureColor;
    device.TextureState[0].AlphaArgument2 = TextureArgument.Diffuse;
    device.TextureState[0].TextureCoordinateIndex = 0; //only one UV
    device.SetSamplerState(0, SamplerStageStates.MagFilter, (int)TextureFilter.Linear);
    device.SetSamplerState(0, SamplerStageStates.MinFilter, (int)TextureFilter.Linear);
    device.SetSamplerState(0, SamplerStageStates.AddressU, (int)TextureAddress.Clamp);
    device.SetSamplerState(0, SamplerStageStates.AddressV, (int)TextureAddress.Clamp);
     
    device.TextureState[1].ColorOperation = TextureOperation.Modulate;
    device.TextureState[1].ColorArgument1 = TextureArgument.TextureColor;
    device.TextureState[1].ColorArgument2 = TextureArgument.Current;
    device.TextureState[1].AlphaOperation = TextureOperation.SelectArg1;
    device.TextureState[1].AlphaArgument1 = TextureArgument.Current;
    device.TextureState[1].TextureCoordinateIndex = 0; //only one UV
    device.SetSamplerState(1, SamplerStageStates.MagFilter, (int)TextureFilter.Linear);
    device.SetSamplerState(1, SamplerStageStates.MinFilter, (int)TextureFilter.Linear);
    device.SetSamplerState(1, SamplerStageStates.AddressU, (int)TextureAddress.Clamp);
    device.SetSamplerState(1, SamplerStageStates.AddressV, (int)TextureAddress.Clamp);
     
    device.TextureState[2].ColorOperation = TextureOperation.Disable;
    device.TextureState[2].AlphaOperation = TextureOperation.Disable;
     
     
     
    try
    {
        device.SetTexture(0, oAlphaTexture);
        device.SetTexture(1, oTexture);
        device.SetTexture(2, null);
    }
    catch (DirectXException e)
    {
        MessageBox.Show("DirectXException " + e.ToString());
    }
    CustomVertex.TransformedColoredTextured[] verts = new CustomVertex.TransformedColoredTextured[10];
     
    float x = rect.X;
    float y = rect.Y;
    float w = rect.Width;
    float h = rect.Height;
    verts[0].Position = new Vector4(x, y, 0, 1);
    verts[0].Tu = 0;
    verts[0].Tv = 0;
    verts[0].Color = -1;
     
    verts[1].Position = new Vector4(x, y + h, 0, 1);
    verts[1].Tu = 0;
    verts[1].Tv = 1;
    verts[1].Color = -1;
     
    verts[2].Position = new Vector4(x + w, y, 0, 1);
    verts[2].Tu = 1;
    verts[2].Tv = 0;
    verts[2].Color = -1;
     
    verts[3].Position = new Vector4(x + w, y + h, 0, 1);
    verts[3].Tu = 1;
    verts[3].Tv = 1;
    verts[3].Color = -1;
     
    device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, verts);
    device.SetTexture(0, null);
    device.SetTexture(1, null);

Discussions similaires

  1. Textures tga/affichage
    Par seeme dans le forum OpenGL
    Réponses: 2
    Dernier message: 20/02/2006, 11h30
  2. Textures et affichage
    Par batosai dans le forum DirectX
    Réponses: 2
    Dernier message: 06/12/2005, 21h07
  3. Pas d'affichage de texture sur certains PC
    Par octopus984 dans le forum GLUT
    Réponses: 7
    Dernier message: 19/04/2005, 13h22
  4. Probleme d affichage de texture
    Par venomelektro dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/09/2004, 15h07
  5. affichage de textures
    Par khayyam90 dans le forum OpenGL
    Réponses: 3
    Dernier message: 05/07/2004, 10h31

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