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 :

Débutant: affichage d'un quad texturé


Sujet :

DirectX

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 190
    Points : 165
    Points
    165
    Par défaut Débutant: affichage d'un quad texturé
    Salut tout le monde,

    je viens de débuter en Direct3D et je suis face à un probleme d'affichage de texture : les textures s'affichent correctement, mais on arrive à voir la séparation des textures, comme s'il y avait un décalage. Apparemment, c'est un probleme connu, puisuqe dans la plupart des tutos, il est mentionné qu'il faut un décalage de -0.5 sur les coordonnées des vertex. Or, m^me avec ce décalage, j'ai toujours le même souci. Voici mes sources :

    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
     
    const DWORD D3DFVF_TLVERTEX = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
     
    struct TLVERTEX
    {
        float x;
        float y;
        float z;
        D3DCOLOR colour;
        float u;
        float v;
    };
     
     
    IDirect3DTexture9* Texture::LoadTexture(char *fileName) {
    	    IDirect3DTexture9 *d3dTexture;
        D3DXIMAGE_INFO SrcInfo;
     
        D3DCOLOR colorkey = 0xFFFF00FF;
        // Load image from file
    	if (FAILED(D3DXCreateTextureFromFileEx (d3dDevice, fileName, 0 , 0, 0, 0, 
    		D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_FILTER_LINEAR, D3DX_DEFAULT, 
              colorkey, &SrcInfo, NULL, &d3dTexture)))
        {
            return NULL;
        }
     
    	imageWidth = SrcInfo.Width;
    	imageHeight = SrcInfo.Height;
    	//Return the newly made texture
        return d3dTexture;
    }
     
    void TexturedRectangleView::draw() {
     
    	//TLVERTEX* vertices;
     
    	//Lock the vertex buffer
    	textureVertexBuffer->Lock(0, 0, (void **)&vertices, NULL);
     
    	D3DCOLOR vertexColour = D3DCOLOR_XRGB( 255, 255, 255);
    	//Setup vertices
    	//A -0.5f modifier is applied to vertex coordinates to match texture and screen coords
    	//Some drivers may compensate for this automatically, but on others texture alignment errors are introduced
    	//More information on this can be found in the Direct3D 9 documentation
     
    	float decal = 0.5f;
    	position.z = 0;
    	vertices[0].colour = vertexColour;
    	vertices[0].x = position.x- decal;
    	vertices[0].y = position.y+height- decal;
    	vertices[0].z = position.z;
    	vertices[0].u = 0.0f;
    	vertices[0].v = 0.0f;
     
    	vertices[1].colour = vertexColour;
    	vertices[1].x =  position.x+width- decal;
    	vertices[1].y =  position.y+height- decal;
    	vertices[1].z = position.z;
     
    	vertices[1].u = texture->width;
    	vertices[1].v = 0.0f;
     
    	vertices[2].colour = vertexColour;
    	vertices[2].x =  position.x+width- decal;
    	vertices[2].y =  position.y- decal;
    	vertices[2].z = position.z;
     
    	vertices[2].u = texture->width;
    	vertices[2].v = texture->height;
     
    	vertices[3].colour = vertexColour;
    	vertices[3].x = position.x- decal;
    	vertices[3].y = position.y- decal;
    	vertices[3].z = position.z;
     
    	vertices[3].u = 0.0f;
    	vertices[3].v = texture->height;
     
    	//Unlock the vertex buffer
    	textureVertexBuffer->Unlock();
     
        //Set texture
    	d3dDevice->SetTexture (0, texture->data);
     
        //Draw image
        d3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 );
     
    }
    voila, merci d'avance pour votre aide ^^

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    http://www.codesampler.com/dx9src/dx...tm#dx9_texture


    par contre j'ai jamais entendu parlé de ce décalage de 0.5, si tu pouvais mettre un lien vers un tuto le mentionnant

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 190
    Points : 165
    Points
    165
    Par défaut
    Salut,

    merci pour ta réponse. Je suis allé voir le tutoriel. Dans celui-ci, ils utilisent la fonction D3DXCreateTextureFromFile qui ne prend que 3 arguments : le device, le fichier et le pointeur vers la texture. Or, ce que j'essaie de faire est un tout petit peu plus complexe : j'essaie en fait de charger des decors 2d via des quads texturés, ces decors sont de tailles diverses, donc j'ai besoin de connaitre la taille d'origine des images. En plus de ca, certaines de mes textures doivent être repetées Il me faut donc utiliser la fonction D3DXCreateTextureFromFileEx, mais j'y mets peut etre pas les bons arguments, car moi, j'ai des textures non puissance de 2 ... Pour info, voici le lien du tuto ou j'ai vu le decalage de 0.5 :
    http://www.gamedev.net/reference/pro...uads/page3.asp

    voila, en esperant avoir été plus clair ^^

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    pour répéter une texture (si tu connais le nombre de répétition nécessaire), ça ne se fait pas au chargement de celle-ci :

    la méthode SetSamplerState du device te permet de faire ça simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HRESULT SetSamplerState(
      DWORD Sampler,
      D3DSAMPLERSTATETYPE Type,
      DWORD Value
    );
    en mettant le type à D3DSAMP_X où X = ADDRESSU ou ADDRESSV ou ADDRESSW, tu peux choisir comment seront gérées les coordonnées de texture en dehors de [0, 1], tu as les valeurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef enum D3DTEXTUREADDRESS
    {
        D3DTADDRESS_WRAP = 1,
        D3DTADDRESS_MIRROR = 2,
        D3DTADDRESS_CLAMP = 3,
        D3DTADDRESS_BORDER = 4,
        D3DTADDRESS_MIRRORONCE = 5,
        D3DTADDRESS_FORCE_DWORD = 0x7fffffff,
    } D3DTEXTUREADDRESS, *LPD3DTEXTUREADDRESS;
    il ne te reste plus qu'à mettre des coordonnées de texture adéquates par exemple dans l'exemple que j'ai donné le lien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dans le remplissage du tableau de vertices :
    Vertex g_quadVertices[] =
    {
    	{-1.0f, 1.0f, 0.0f,  0.0f,0.0f },
    	{ 1.0f, 1.0f, 0.0f,  2.0f,0.0f },
    	{-1.0f,-1.0f, 0.0f,  0.0f,3.0f },
    	{ 1.0f,-1.0f, 0.0f,  2.0f,3.0f }
    };
     
    et juste après le SetTexture :
    g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
    et avec ça tu répète ta texture 2 fois sur l'axe X, 3 fois sur l'axe Y avec un miroir selon X

Discussions similaires

  1. [Débutant] Affichage d'un video avi sur le web
    Par oumani dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 06/02/2006, 13h47
  2. [Débutant] affichage opengl dans un TPanel
    Par minnit_s dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/01/2006, 23h03
  3. [Débutant] Affichage d'une grille
    Par Mathieu.J dans le forum OpenGL
    Réponses: 25
    Dernier message: 13/06/2004, 19h38
  4. [QuickReport][Débutant] Affichage d'un graphique
    Par poufouille dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/03/2004, 09h03
  5. [Débutant] Affichage impossible en local
    Par Alberto dans le forum ASP
    Réponses: 2
    Dernier message: 29/11/2003, 16h45

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