Bonjour
quelqu'un a t-il une idée pour tracer des lignes et polygones 2D avec directX ?
d'avance merci
Bonjour
quelqu'un a t-il une idée pour tracer des lignes et polygones 2D avec directX ?
d'avance merci
ID3DXLine ou DrawPrimitive avec Line lists ou line strips
IDX3DLine ne semble exister qu'en DX9, moi je code sous DX8, donc je me suis intéressé à drawprimitive, mais soit il y a une solution miséreuse avec des buffer, des locks etc... le bazard total, soit j'ai vu une solution en gros comme ca
mais comme c'est très mal documenté, je ne sais pas du tout quoi utiliser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 D3DLVERTEX l_vertices[2]; l_vertices[0] = D3DLVERTEX(D3DVECTOR(_startX, _startY, 0), 0xFFFFFFFF, 0xFFFFFFFF, 0.0f, 0.0f); l_vertices[1] = D3DLVERTEX(D3DVECTOR(_endX, _endY, 0), 0xFFFFFFFF, 0xFFFFFFFF, 0.0f, 0.0f); device.DrawPrimitive(D3DPT_LINELIST, D3DFVF_LVERTEX, l_vertices, 2, D3DDP_WAIT);
, je veux juste tracer une ligne 2D à l'écran... quels vertex utiliser ? comment ? faut-il mettre D2DDP_WAIT, etc...
une petite idée ?
d'avance merci
j'ai vraiment du mal avec drawprimtive
d'autant plus que D2DVERTEX et comagnie est défini dans <d3dtypes.h> et qu'il y a des conflits avec <d3dx8.h> du coup...
sachant que si je mets ca
ca résoud des conflits, mais ca m'en sort d'autres au niveau de d3d8math.h avec une redéclaration de D3DXVECTOR3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include <d3dx.h> #include <d3dx8.h>
bref c'est la misère totale le .h avec directx....
comment s'en sort on ?
d'avance merci
En ne mixant pas les vieux headers et les nouveaux. Si tu bosses avec DirectX8, tu inclues d3dx8.h, c'est tout. Pareil pour les autres.comment s'en sort on ?
En général, pour DirectGraphics 8, d3d8.h et d3dx8.h suffisent.
la declaration deD3DVERTEX n'existe que dans d3dtypes ...
Moi je n'ai aucun problème en incluant d3dtypes.h . Essaie avec d3d8types.h.
Mais à mon avis tu auras plus vite fait de définir toi-même la structure de vertices qui correspond à ton FVF, je t'avoue que des D3DVERTEX j'en n'ai jamais vu nulle part.
Sinon pour répondre à la question précédente, il faut que tu utilises DrawPrimitiveUP si tu n'as pas de vertex buffer. Mais c'est très lent.
alors avec le createbuffer, utilisé comme suit :
ca me renvoie toujours NULL dans pVertices, qui fait planter dans le memcpy, forcément...
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 LPDIRECT3DVERTEXBUFFER8 l_vb; void * pVertices; CUSTOMVERTEX g_Vertices[] = { { 25, 25, 0, 0xffff0000, }, { 50,50, 0, 0xff0000ff, }, { 18, 75, 0, 0xffffffff, }, }; if( device->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0 , D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &l_vb ) != D3D_OK ) if( l_vb->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) !=D3D_OK ) return; memcpy( pVertices, g_Vertices, sizeof(g_Vertices) ); l_vb->Unlock(); g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) ); g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 ); device->SetStreamSource( 0, l_vb, sizeof(CUSTOMVERTEX) ); device->SetVertexShader( D3DFVF_CUSTOMVERTEX );/ device->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 1 );
ok puor DrawPrimitiveUP mais ceci n'affiche rien du tout
ma surface directX étant 800*600*32, je devrai le voir...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CUSTOMVERTEX g_Vertices[] = { { 25, 25, 0, 0xffff0000, }, { 50,50, 0, 0xff0000ff, }, { 18, 75, 0, 0xffffffff, }, }; device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 1, &g_Vertices, sizeof(CUSTOMVERTEX));
j'ai aussi essayé ca :
avec ceci comme définition
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 static CUSTOMVERTEX g_Vertices[]={ //A square with a dark center {100,200,1,1, 0xFFFFFFFF}, {0,100,1,1,0xFFFFFFFF}, {200,100,1,1,0xFFFFFFFF}, {200,300,1,1, 0xFFFFFFFF}, {0,300,1,1,0xFFFFFFFF}, { 0,100,1,1,0xFFFFFFFF} }; device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 4, &g_Vertices, sizeof(CUSTOMVERTEX));
marche pas mieux...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct CUSTOMVERTEX { float x; float y; float z; float rhw; unsigned long color; };
Pour le 1) : je crois que c'est le Lock(0, qq_chose, ...) qu'il aime pas. Il faut mettre 0 aussi dans la taille à verrouiller (2eme paramètre), ça devrait passer mieux. Je crois que tu n'as le droit de faire ça qu'avec un buffer dynamique (avec le flag D3DLOCK_NOOVERWRITE) (enfin je dis ça un peu au pifometre).
Pour le 2) : le fait que tu ne vois rien, ça peut venir d'une foule de choses. Par exemple un mauvais sens de culling, une matrice mal définie, un renderstate mal initialisé, ... En général c'est le culling
Et aussi, n'utilise pas les TRIANGLEFAN.
Pour le 3) : t'as un problème au niveau de tes vertices je crois. Essaye deja de rendre un seul triangle avec des TRIANGLELIST, ou un quad en TRIANGLESTRIP.
je n'ai pas mis de CULL, par défaut c'est activé ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 struct CUSTOMVERTEX { float x; float y; float z; // float rhw; unsigned long color; }; #define CUSTOMVERTEX_FORMAT (D3DFVF_XYZ | D3DFVF_DIFFUSE)ca n'affiche rien du tout...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 device->SetVertexShader(CUSTOMVERTEX_FORMAT); static CUSTOMVERTEX g_Vertices[]={ {0,0,0,0xFFFFFFFF}, {100,100,0,0xFFFFFFFF}, {0,100,0,0xFFFFFFFF} }; device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, &g_Vertices, sizeof(CUSTOMVERTEX));
toutes les autres fonctions (afficher du texte et rendre une texture) marchent impeccable
en tout cas, merci de passer du temps à m'aider...
Par défaut le culling est a D3DCULL_CCW (sens inverse des aiguiles d'une montre).
Et sinon, comment t'as initialisé tes matrice de world, view et proj ? T'as bien desactivé le lighting ?
voici mon initialisation :
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 Render2DSurfaceWin32 & l_surfaceWindows = (Render2DSurfaceWin32 &)_surface; deInitialize(); direct3DObject = Direct3DCreate8(D3D_SDK_VERSION); if (!direct3DObject) return false; if (direct3DObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) != D3D_OK) return false; memset(&d3dpp, 0, sizeof(D3DPRESENT_PARAMETERS)); d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ; d3dpp.BackBufferWidth = _witdh; d3dpp.BackBufferHeight = _height; d3dpp.BackBufferCount = 1; d3dpp.BackBufferFormat = d3ddm.Format; if (_bpp == 32) d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // !!! 32bits per pixel d3dpp.Windowed = !_fullscreen; if (_fullscreen) d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE ; if (direct3DObject->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, l_surfaceWindows.handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &device) != D3D_OK) return false; if (D3DXCreateSprite(device, &spritesRoutines) != D3D_OK) return false; memset(&deviceInfos, sizeof(D3DCAPS8), 0); if (direct3DObject->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &deviceInfos) != D3D_OK) return false; width = _witdh; height = _height; renderClear(); renderShow(); return true;
Initialise au moins ta matrice de projection.
Et il y a aussi quelques renderstates à initialiser pour ne pas avoir de surprises.
J'ai rajouté ceci
Alors maintenant le problème est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 D3DXMATRIX l_projection2DMatrix; D3DXMATRIX l_identityMatrix; D3DXMatrixOrthoLH(&l_projection2DMatrix, _width, _height, 0.0f, 1.0f); D3DXMatrixIdentity(&l_identityMatrix); device->SetTransform(D3DTS_PROJECTION, &l_projection2DMatrix); device->SetTransform(D3DTS_WORLD, &l_identityMatrix); device->SetTransform(D3DTS_VIEW, &l_identityMatrix); device->SetVertexShader(CUSTOMVERTEX_FORMAT);
quand je n'affiche rien d'autre que le triangle:
il a bien la bonne forme, mais il est rouge avec un dégradé vers le transparent en direction d'un bord (alors que je n'ai spécifié ca nulle part)
quand je dessine une texture, puis le rectangle, je n'ai que la texture qui s'affiche, et parfois le triangle qui clignote derrière...
En fait ça irait plus vite si tu donnais un programme complet(mais petit !) qui compile, parce que là avec des bouts de coe c'est difficile de voir ce qui ne va pas .
Acceptes-tu que je t'envoies mon programme... tu verras il n'est pas gros
(mais pour compiler il faut bien évidemment directx8, donc je peux aussi t'envoyer les lib directx8 si ca t'embete d'installer tout le sdk pour tester l'appli)
NB : je teste sous builder
si tu acceptes, envoies-moi ton email par mp
NB2 : j'ai reverifié 1 par 1 tous les parametres avec ceux du tutorial de laurent USA (je veux aussi faire de la 2D en 3D)
Mon email est juste en-dessous (bouton "email"), et pour ce qui est du SDK Dx t'inquiete j'ai tout ce qu'il faut .
envoyé par mail, sinon je suis sous MSN pour toute question. le pseudo est celui de l'adresse mail
Avec Direct Draw y'a que 3 lignes de codes pour tracer des lignes !!
On peut utiliser le GDI avec les surfaces Direct Draw.
Excusez ma vulgarité mais c'est vraiment se faire ch... pour rien.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager