PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : D3DXMeshFromX


Florian222222
2011-05-30, 17:35:42
hier gleich mal code:

int LoadModels()
{
if(!FileExists("batman.x"))
{
MessageBox(NULL,"File doesnt exit","Error",NULL);
return 1;
}
//hier fehler. datei existiert aber
if(FAILED(D3DXLoadMeshFromX("batman.x",D3DXMESH_SYSTEMMEM,g_pD3DDevice,NULL,&pD3DXMtrlBuffer,NULL,&g_dwNumMaterials,&Human_Head)))
{
MessageBox(NULL,"Error Cannot load batman.x","Error",NULL);
return 1;
}
return 0;
};

das programm gibt mir immer wieder den fehler dass batman.x nicht geladen werden kann... alles andere funktioniert soweit und ist schon getestet

Nasenbaer
2011-05-30, 17:47:11
Kurz und bündig formulierte Fragen sind ja ok aber das ist arg spärlich. Vielleicht schaust du erstmal in die SDK-Doku:

Aus der DX11-SDK Doku (June 2010):

HRESULT

If the function succeeds, the return value is D3D_OK. If the function fails, the return value can be one of the following values: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

Ich würde mal überprüfen was als Fehlercode zurückgegeben wird. Dann mal schauen ob die x-Datei eigentlich valide ist (d.h. zum Test mal eine X-Datei aus dem SDK verwenden). Dann Natürlich Leserechte prüfen und schauen ob die übergebenen Parameter alle i.O. sind.
Wenn g_pD3DDevice bspw. NULL ist, dann ist es Banane ob die X-Datei existiert oder nicht - der Function-Call fährt so oder so gegen'n Baum.

Da hier keiner ne Glaskugel besitzt kann das mit den gegebenen Infos aber keiner wissen.



EDIT:
Da du wohl gerade erst mit DirectX anfängst, empfehle ich dir ohnehin gleich bei DirectX 10/11 zu beginnen, sofern du natürlich über Windows Vista aufwärts verfügst. Die Graphikkarte muss dazu nicht mal Dx-10 fähig sein (über sog. Feature-Sets kann man auch mit Dx-9 Karten arbeiten und dennoch DX10/11-Code schreiben). Natürlich kann man dann einige Features nicht nutzen. Aber ich finde, ohne DX9 so intensiv genutzt zu haben, das seit Version 10 alles doch wesentlich einfacher umsetzbar ist, da man keinen Mix aus Fixed-Function und Shader-Programmierung hat. Gibt auch ne Menge Bücher zum Thema oder halt Tutorials im Netz.

Florian222222
2011-05-30, 18:03:14
sry für die spärliche beschreibung
ich weiß leider nicht wie ich HRESULT vernünftig ausgebe
also habe ich mir im debugger angesehen welchen wert hresult hat
-2005531767

zum code, ich habe alles in klassen verpackt und es sind über 400 zeilen. welche teile sollte ich genauer posten? window erstellen,init direct3d,...

Florian222222
2011-05-30, 18:05:22
zu deinem tipp^^
ich habe win7 und verfüge über eine dx9 fähige graka. hab mir ein buch gekauft "3D Spieleprogrammierung mit C++ und DX9"
um wieviel einfacher ist dx11? hoffe dass endlich mal was funzt. danke im voraus

Florian222222
2011-05-30, 18:22:37
so nochmal überarbeitet
int LoadModels()
{
HRESULT h;
if(FAILED(h=D3DXLoadMeshFromX("cup.obj",D3DXMESH_SYSTEMMEM,g_pD3DDevice,NULL,&MaterialBuffer,NULL,&g_dwNumMaterials,&Human_Head)))
{
if(h==D3DERR_INVALIDCALL) MessageBox(NULL,"invalid call","Error",NULL);
if(h==E_OUTOFMEMORY) MessageBox(NULL,"out of mem","error",NULL);
return 1;
}
return 0;
};

das programm schließt sich einfach ergo keiner der oben genannten fehler trat auf. cup.obj ist ein sample aus dx-sdk

Florian222222
2011-05-31, 14:30:29
so. ich nochmal. hoffe dass mir jetzt jemand zurückschreibt ;D
habe jetzt sehr viel herumprobiert und es funktioniert einfach nicht. ich vermute dass ich einen fehler bei der initialisierung von D3DDevice gemacht habe. hier der code:

int GetDirect3DParameters(D3DPRESENT_PARAMETERS *pOut,HWND hWindow,bool fullscreen)
{
pOut->Windowed=!fullscreen;
pOut->SwapEffect=D3DSWAPEFFECT_DISCARD;
pOut->hDeviceWindow=hWindow;
pOut->EnableAutoDepthStencil=true;
pOut->AutoDepthStencilFormat=D3DFMT_D16;
if(fullscreen)
{
pOut->BackBufferFormat = D3DFMT_X8R8G8B8; // set the back buffer format to 32-bit
pOut->BackBufferWidth = GetSystemMetrics(SM_CXSCREEN); // set the width of the buffer
pOut->BackBufferHeight = GetSystemMetrics(SM_CYSCREEN); // set the height of the buffer
}
return 0;
};

int InitDirect3D(HWND hWindow,bool fullscreen)
{
g_pD3D=NULL;
g_pD3DDevice=NULL;

D3DPRESENT_PARAMETERS pParameters;
ZeroMemory(&pParameters,sizeof(pParameters));

if(GetDirect3DParameters(&pParameters,hWindow,fullscreen)!=0)
{
MessageBox(NULL,"Error GetDirect3DParameters(pParameters)!=0","Error",MB_OK);
return 1;
}

g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(!g_pD3D)
{
MessageBox(NULL,"Error creating pD3D","Error",MB_OK);
return 1;
}

if(FAILED(g_pD3D->CreateDevice(0,D3DDEVTYPE_HAL,hWindow,D3DCREATE_HARDWARE_VERTEXPROCESSING,&pParameters,&g_pD3DDevice)))
{
MessageBox(NULL,"Error Creating Device","Error",NULL);
return 1;
}

if(!g_pD3DDevice)
{
MessageBox(NULL,"Error pD3DDevice NULL","Error",NULL);
return 1;
}

//Einstellungen

if(FAILED(g_pD3DDevice->SetFVF(Vertex::fvf)))
{
MessageBox(NULL,"Error Setting Vertex Format","Error",NULL);
return 1;
}

//später einstellbar

g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
g_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE);
g_pD3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);

return 0;
}

Florian222222
2011-05-31, 17:14:03
so auch da mir keiner geholfen hat.
ich halte es hier für die nachwelt fest.
die methode hat noch einen fehlercode D3DXFERR_FILENOTFOUND.
ich hatte es im falschen ordner....

Nasenbaer
2011-06-02, 20:51:33
Ohh, irgendwie habe ich keinerlei Nachricht bekommen, dass es neue Antworten gab, sonst hätte ich schon eher zurückgeschrieben.
Dein Problem hast du ja anscheinend alleine gelöst bekommen, also kommen wir zur DX9 vs. 10/11 Sache:

Ich hab kaum was in DX9 gemacht aber stolpere in der DX-Doku natürlich öfter mal drüber oder bei der Suche im Netz. Die Sache ist ja die, dass man heutzutage eigentlich alles über Shader macht und DX9 noch nicht komplett drauf ausgelegt ist. Man kann natürlich auch Vertex- und Pixelshader verwenden aber es gibt auch Alternativen dazu. Das macht es IMO für einen Einsteiger natürlich unübersichtlicher weil man diese beiden "Welten" trennen muss.
Und auch so manch anderer hier hat seinerzeit die Neuerungen und das Code-Cleanup (also rausschmeißen nicht mehr benötigter Funktion beim DX9 nach DX10 Wechsel) begrüßt.

Falls du dem Englischen mächtig bist und mit C++ und linearer Algebra (Vektoren, Matrizen, etc.) umgehen kannst, dann empfehle ich dir dieses Buch:

http://www.d3dcoder.net/d3d10.htm -> Amazon-Link (http://www.amazon.de/Introduction-Programming-DirectX-Wordware-Graphics/dp/1598220535/ref=sr_1_1?ie=UTF8&s=books-intl-de&qid=1307040420&sr=8-1)
Etwas billiger bekommst du Beginning DirectX 11 Game Programming (http://www.amazon.de/Beginning-DirectX-11-Game-Programming/dp/1435458958/ref=sr_1_1?ie=UTF8&qid=1307040921&sr=8-1) - da ich dieses, im Gegensatz zum anderen aber nicht selbst gelesen habe, kann ich dir dazu aber auch nichts weiter sagen.

Gute deutsche Bücher scheint's da wohl nicht so richtig zu geben. Der Unterschied zwischen DX10 und DX11 ist übrigens minimal.

Falls du übrigens an Algorithmen bzgl. Echtzeitgraphik allgemein interessiert bist, dann kann ich dir nur Real-Time Rendering 3rd Ed. (http://www.realtimerendering.com/) empfehlen. Darin findest du im Prinzip alles wesentliche was man so brauch fürs 3D-Rendering - was einem das Buch halt nicht sagt ist, wie man das dann mit DirectX oder OpenGL umsetzt.

Florian222222
2011-06-06, 18:38:31
ich hab mir jetzt "Spieleprogrammierung mit DirectX11 und C++" von Susanne Widgard gekauft und werde das jetzt mal lesen. Da ich aber das Problem habe dass meine GraKa nur dx9 unterstützt würde ich gerne wissen wie man dx11 darauf zum laufen bringen kann...
hab das zwar gelesen mit dem feature set, kann damit aber nicht wirklich was anfangen.
über einen link zu einem tutorial oder whatever würde ich mich sehr freuen ;D

Nasenbaer
2011-06-06, 19:39:17
Tutorials dazu kenn ich nicht aber ich versuchs mal zu erklären:

Mit der Funktion D3D11CreateDeviceAndSwapChain() erstellst du ja ein Device und die SwapChain (die also für das Wechseln zwischen Front- und Backbuffer zuständig ist). Der Funktion übergibt man auch ein Parameter zu Angabe des gewünschten FeatureSets. Das beschränkt im Prinzip die Möglichkeiten, die man mit diesem Device hat. Bspw. kannst du keinen Compute-Shader erstellen. Oder die Vertex-/Pixel-shader, die du erstellst, kannst du natürlich nicht als Shader-Model 5 kompilieren (Shader-Model 3 war glaub ich DirectX 9).
Diese kannst du ja bspw. mit der Funktion D3DX11CompileFromFile() aus eine Datei heraus kompilieren und der 5. Parameter der Funktion gibt dann die Shader-Model-Version an.

Soweit klar? Sonst weiter fragen. :)

Florian222222
2011-06-07, 15:58:09
ok danke erstmal. is mir jetzt fürs erste klar. hab leider grad wenig zeit mich damit zu beschäftigen. Schule und so...
aber werds mir mal ansehen
ty nochmal