PDA

Voir la version complète : Cube flouté, un problème étrange !


janta
25/11/2005, 17h35
Hello all :) Ceci est mon premier message !
Disons que je débute avec directX, et en essayent de me conformer au framework proposé par la version 9, voici le phénomène paranormal que je rencontre...

J'essaye simplement de faire tourner un pavé pour me familiariser un peu avec les listes de vertices et d'indices, les matrices de transformation etc.

Lorsque la vitesse de rotation est assez lente, le pavé s'affiche correctement, mais dès que j'augmnte un peu, je vois un léger effet de dédoublement, comme si je voyais 2 pavés avec environ 1 mm de décalage... Un truc un peu dans le style d'une image faite pour etre regardée avec des lunettes 3d... Je sais pas si j'arrive a bien me faire comprendre.

Je vous montre ma fonction OnFrameRender()

void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
FLOAT fAngle = (timeGetTime() % 10000) * (2.0f * D3DX_PI) / 10000.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, D3DXMatrixRotationYawPitchRoll(&matWorld, fAngle, fAngle, fAngle) );


V( pd3dDevice->SetStreamSource( 0, pVB, 0, sizeof(MYVERTEX) ));
V( pd3dDevice->SetFVF( MYVERTEX_FORMAT ));
V( pd3dDevice->SetIndices(pIB));

if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{

V( pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12) );
V( pd3dDevice->EndScene() );

V(pd3dDevice->Present( NULL, NULL, NULL, NULL ));
}
}

Ne cherchez pas à savoir pourquoi j'utilise le temps absolu du systeme (timeGetTime) plutot que le paramètre du callback (c'est ce que je devrais faire), j'ai essayé et le résultat est strictement identique.

J'ai expérimenté le meme procédé de rendu (ultra simplissime...) sans utiliser le framework fourni mais en faisant moi meme mes initialisation et ma propre boucle, et je n'ai pas cet effet du tout....

Gnééé :)
J'avoue que je sèche, j'ai fait plein de tests en modifiant les render state etc.
Rien n'y fait.

Ma méthode OnFrameMove est pour l'instant vide, les autres méthodes contiennent initialisation et libération des buffers. Les vertices et les indices sont définis en globals

Voila, si quelecun a un indice pour moi :00000020:

PS: petit salut a lightness1024 je sais pas si tu te souviens de moi, on avait échangé qq mails il y a longtemps a propos de ton projet Sehrum ;)

janta
26/11/2005, 01h27
Allez pour ceux qui veulent rire... je vous explique d'ou venait le probleme...
(je pense que la solution va aussi vous aider a comprendre en fait la tete que pouvait avoir mon probleme car je n'ai pas ete bien clair dans mes explications...)

En fait le framework effectue lui même "en interne" le swap entre les surfaces, ce qui fait que mon instruction Present(NULL,...); etait en trop.

Résultat un flip de trop et une sorte de trainée se baladant aux fesses de mon cube qui n'etait en fait que l'image précédente... Maintenant que j'ai trouvé ca me parait tellement évident ;)

Je pense que j'ai meme eu de la chance car en fonction des flas lors de la création de la surface je pense que faire deux swap d'affilée nous colle un gentil B.S.O.D :D

Merci a ceux qui auront lu le message en tout cas ;)

A+