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 :

[Managed DX9] Problème d'affichage de couleur


Sujet :

DirectX

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 586
    Par défaut [Managed DX9] Problème d'affichage de couleur
    Bonjour à tous.
    J'ai un petit problème bizarre. J'utilise Managed DX9 et ça se passe dans Direct3D.

    J'affiche l'un à côté de l'autre 2 cubes en 3D, le premier étant fait de vertices CustomVertex.PositionColored (c'est-à-dire en couleurs), le deuxième étant fait de vertices CustomVertex.PositionTextured (c'est-à-dire avec texture mais sans couleur supplémentaire).

    Ces deux cubes sont identiques, les 8 points ayant les mêmes coordonnées dans les 2 VertexBuffers que j'utilise. La différence est que le 1er contient les couleurs (4 en tout pour les 8 points), et le 2ème des coordonnées u,v de texture. De plus, bien sûr, j'en translate l'un à gauche et l'autre à droite, histoire de voir les 2
    J'utilise 2 IndexBuffers, dont le contenu est exactement identique.
    La texture est un bmp de 64x128 tout à fait classique.

    La portion de code qui coince est la suivante (en rouge ci-dessous):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //Cube coloré
    D.Transform.World=Matrix.Translation(-2, 0, 0)
    D.VertexFormat=CustomVertex.PositionColored.Format
    D.SetStreamSource(0,VB[0],0)
    D.Indices=IB[0]
    D.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12)
    //Cube texturé
    D.Transform.World=Matrix.Translation(2, 0, 0)
    D.VertexFormat=CustomVertex.PositionTextured.Format
    D.SetStreamSource(0, VBT, 0)
    D.SetTexture(0, texture)
    D.Indices=IB[1]
    D.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12)
    Lorsque la ligne en rouge est commentée, le cube en couleur s'affiche correctement, avec les 4 couleurs visibles (et le cube texturé est tout en blanc).
    Lorsque la ligne rouge est décommentée, le cube texturé fait apparaitre des morceaux de mon bmp (c'est Ok), mais le cube en couleur n'a plus que 2 couleurs différentes au lieu des 4!

    Mon problème: quelle peut être l'influence d'un SetTexture sur un objet dessiné avant et bâti avec des points sans texture?

    (J'ai remarqué aussi qu'utiliser un IndexBuffer pour dessiner des objets avec Texture n'est pas l'idéal... Mais en remplaçant DrawIndexedPrimitive par DrawPrimitive (et en bricolant un peu les paramètres pour que ça fonctionne), le problème persiste!)

  2. #2
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Citation Envoyé par Thorna
    Mon problème: quelle peut être l'influence d'un SetTexture sur un objet dessiné avant et bâti avec des points sans texture?
    Elle est setté à quoi la texture avant ?

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 586
    Par défaut
    Comme quoi, même après de très (très (très)) nombreuses années d'informatique, on peut encore se laisser avoir par un problème de 1ère année, que dis-je, de premier mois: ne jamais supposer la valeur d'une variable non initialisée
    Et donc, en rajoutant avant le premier DrawIndexedPrimitive la ligne:
    comme par miracle, et tout soudainement, ça marche...
    Je me collerais des baffes!
    A copier cent fois. J'ai honte!
    Moralité: ne jamais rester devant son écran après 23h...
    Merci!

  4. #4
    Membre expérimenté Avatar de Sixissor
    Étudiant
    Inscrit en
    Février 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 206
    Par défaut
    Citation Envoyé par Thorna
    Moralité: ne jamais rester devant son écran après 23h...
    P'tit joueur


  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 586
    Par défaut
    Bah, tu sais, le soir après 23h, c'est comme dans la vie après 23 ans, la productivité baisse

    En attendant, et après réflexion, j'ai moins honte!
    En effet, c'est quand même assez mal expliqué dans la doc de DirectX, qu'après avoir:
    - déclaré un VertexBuffer en précisant le type CustomVertex.PositionColored
    - précisé aussi le format CustomVertex.Positioncolored.Format
    - rempli le buffer d'une tonne de points de type CustomVertex.PositionColored
    - reprécisé encore au moment de l'affichage device.VertexFormat=CustomVertex.PositionColored.Format

    il fallait à nouveau prendre soin de mettre la texture à null...
    Je sais qu'il faut être prudent quand on programme, mais à ce point, c'est de l'obsession! La prochaine fois, je le saurai, mais pour celle-ci, je me vote les circonstances atténuantes.

  6. #6
    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
    En attendant, et après réflexion, j'ai moins honte!
    En effet, c'est quand même assez mal expliqué dans la doc de DirectX, qu'après avoir:
    - déclaré un VertexBuffer en précisant le type CustomVertex.PositionColored
    - précisé aussi le format CustomVertex.Positioncolored.Format
    - rempli le buffer d'une tonne de points de type CustomVertex.PositionColored
    - reprécisé encore au moment de l'affichage device.VertexFormat=CustomVertex.PositionColored.Format

    il fallait à nouveau prendre soin de mettre la texture à null...
    Ca n'a pas vraiment de rapport. Si tes états sont par défaut parametrés pour moduler la couleur des sommets avec la texture courante (ce qui doit être le cas), alors il faudra bien préciser quelle texture tu utilises (en l'occurence aucune dans ton cas).

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 586
    Par défaut
    Oui, c'est exact, il faut préciser que je ne veux aucune texture. C'est d'ailleurs ce que j'ai dit, redit, reredit et rereredit en précisant PositionColored, puisqu'il me semble que la seule différence avec PositionTextured, c'est justement l'usage ou non de la texture... Mais bon, c'est un débat qui n'a pas trop de rapport avec mon problème et, bon, j'utilise DX volontairement, et donc je fais avec

    Il reste une question intéressante: je dessine un cube avec ses 6 faces, pour lesquelles je veux une texture différente, ou mieux encore, 3 faces texturées différemment et 3 faces uniquement colorées et de différentes couleurs.
    Si j'ai bien compris le principe, là où j'en suis actuellement, je ne peux pas faire d'économie et je dois déclarer 4 points par face, soit 24 points en tout, alors qu'il n'y en a que 8 dans mon cube... Si j'ai bien compris l'utilité de l'IndexBuffer, c'était justement de ne déclarer que 8 points et de répéter aussi souvent que possible l'index du point selon que je dessine tel ou tel triangle. Est-ce que ça ne diminue par l'intérêt de ces IndexBuffers, qui ne peuvent être utilisés alors que dans l'affichage d'une multitude de triangles qui partagent tous la même texture ou la même couleur?

  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
    Oui, c'est exact, il faut préciser que je ne veux aucune texture. C'est d'ailleurs ce que j'ai dit, redit, reredit et rereredit en précisant PositionColored, puisqu'il me semble que la seule différence avec PositionTextured, c'est justement l'usage ou non de la texture...
    Pas exactment. Tu dis que tes points ne contiennent pas de coordonnées de textures, mais pas que tu ne veux pas utiliser le texturage.

    Pour ton autre problème, à partir du moment où tu veux des textures différentes sur chaque face il te faudra des coordonnées de texture différentes. Tu n'auras donc comme tu l'as compris plus 8 points pour ton cube, mais 24 (deux points ayant la même position mais des coordonnées de texture différentes -- ou même n'importe quelle autre composante -- sont bien considérés différents).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affichage : bug des couleurs
    Par Nimajneb dans le forum Matériel
    Réponses: 1
    Dernier message: 15/01/2008, 21h10
  2. [Ecran] Problème d'affichage de certaine couleur
    Par virgul dans le forum Périphériques
    Réponses: 1
    Dernier message: 24/09/2007, 15h35
  3. [office]problème d'affichage des couleurs
    Par doc_nounours dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 09/07/2006, 11h18
  4. [DX9][Managed C#] Problème chargement .x
    Par lancer83 dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 23/06/2006, 14h51
  5. Réponses: 1
    Dernier message: 22/02/2006, 10h56

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