Probleme Direct3D

Salut a tout les L33T COD3R de la cafzone !

Voila j’explique mon probleme : j’arrive pas à initialiser ma fenetre Direct3D … oui ça parait tout con, mais ça plante …

extrait du code :

//////////////////// CLASSE MOTEUR3D //////////////////////
CMoteur3D::CMoteur3D()
{

}

CMoteur3D::~CMoteur3D()
{

}

HRESULT CMoteur3D::Init(HWND hWnd,bool bFullscreen, long nWidth, long nHeight)
{
if (NULL == ( m_pD3D = Direct3DCreate8(D3D_SDK_VERSION ))) return E_FAIL;

HRESULT result;
result = m_pD3D->GetAdapterIdentifier(D3DADAPTER_DEFAULT,0,&d3did);
OutputDebugString("DirectX a trouve le periferique : ");
OutputDebugString(d3did.Description);
OutputDebugString("

");

ZeroMemory( &d3dpp, sizeof(d3dpp) );
           d3dpp.Windowed = !bFullscreen;
           d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
           d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
           d3dpp.EnableAutoDepthStencil = TRUE;
           d3dpp.AutoDepthStencilFormat = D3DFMT_D16;



if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                              D3DCREATE_HARDWARE_VERTEXPROCESSING,
                              &d3dpp, &m_pD3DDev ) ) )
{
	if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                              D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                              &d3dpp, &m_pD3DDev ) ) )
	{
		return E_FAIL;
	}
}

// c'est ici que l'on defini les etats du service
//m_pD3DDev->SetRenderState(D3DRS_CULLMODE , D3DCULL_NONE );
m_pD3DDev->SetRenderState(D3DRS_ZENABLE ,TRUE);
maScene = new CScene(m_pD3DDev);
return S_OK;

}

////////////////////////// FONCTION PRINCIPALE ///////////////
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//enregistre la classe Windows
WNDCLASSEX wc = {
sizeof(WNDCLASSEX),
CS_CLASSDC,
MsgProc,
0L,
0L,
GetModuleHandle(NULL),
NULL,
LoadCursor(NULL,IDC_CROSS),
NULL,
NULL,
WND_CLASS_NAME,
NULL};
RegisterClassEx(&wc);
//Cree la fenetre
HWND hWnd = CreateWindow(WND_CLASS_NAME,WND_NAME,WS_OVERLAPPEDWINDOW,100,100,
WINDOW_WIDTH,WINDOW_HEIGHT,GetDesktopWindow(),NULL,wc.hInstance,NULL);
if (hWnd == NULL) return -1;

//on affiche la fenetre
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);

HRESULT result;	
monMoteur = new CMoteur3D;
result = monMoteur->Init(hWnd,false,WINDOW_WIDTH,WINDOW_HEIGHT);
if (result == E_FAIL){ MessageBox(NULL,"erreur initialisation moteur 3d","ERREUR",1);PostQuitMessage(0);}

Bon, comme vous pouvez le voir, la fonction WinMain intencie ma classe Moteur3D et appele la fonction init() qui me revoie une erreur :casstet:
Pourtant j’utilise les meme parametres qu’un tutorial qui fonctione !

Diantre! ça m’apprendra à lire les posts en diagonale.

[Edité le 31/3/2003 par chevluh]

bas oui, mais il demande pas de fullscreen :

HRESULT CMoteur3D::Init(HWND hWnd,bool bFullscreen, long nWidth, long nHeight)
{
[…des trucs…]
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = !bFullscreen;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
[…des trucs…]
}

[...des trucs...]
result = monMoteur->Init(hWnd,[b]false[/b],WINDOW_WIDTH,WINDOW_HEIGHT);
[...des trucs...]

donc, ca devrait marcher !

ça plante parce que tu ne peux pas utiliser D3DFMT_UNKNOWN en plein écran, ça marche juste si tu fais le rendu dans une fenêtre.

d’abords :y a pas de quoi, et pour ta signature, c’est plus la taille sur la page que le poids de l’image qui m’embete :wink:

Tout d’abort, merci pour ton aide !

Tu pouras remercier ton « expert » c’est bien ma structure D3DPRESENT_PARAMETERS qui est mal initialisée… par contre j’ai toujours pas comprie pourquoi cette initialisation ne marche pas (alors qu’elle fonctionne dans les exemples …)

Je vais enfin pourvoir faire mon mini-shoot-them’up ! Ikaruga n’a qu’a bien se tenir :cool:

Ps : pour ma signature elle est un peut grande mail elle fait que 6ko … bon, je vais essayer de reduire …

3 choses :

  1. j’ai passe ton code a un expert d3d, reponse en attente ! :wink: (je fais pas les api 3d moi, je fait que du « downToTheMetal » :wink: )
  2. si tu veux faire des identations dans du code sur CafZone tu peux faire Alt+0255 (ou Alt+255 je sais plus) mais attention : ca ne marche pas avec les copier-coller
  3. ta signature est un peu grosse, est-ce que tu pourrais reduire un peu la taille de ton sympathique mais neanmoins important logo ?

valavalamarci !

[edit]
la reponse de l’expert !
l’expert dit :

A mon avis le probleme c’est que la structure
D3DPRESENT_PARAMETERS est pas bien remplie.Deja
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN, ben ca va po marcher
des masses.
Un moyen facile et rapide de voir ce qui deconne dans
DirectX, c’est de monter le debug level au maximum dans le
control panel (la jolie ch’tite nicone DirectX). C’est
achement utile, serieux!

donc l’idee c’est que tu as peut etre zapper un ou deux truc en passant de l’example a ton appli !

[Edité le 21/3/2003 par c0unt0]