DirectX normale Handhabung von 3D Modellen?
-
Hi!
Wie (schemenhaft in schritten) behandelt man modelle optimal?
Also auf performance getrimmt.Ich habe ein problem, das ich 5 Meshes (insgesammt) 15MB. 6x transponiere und an den der je neuen position darstelle. das ganze läuft auf dem netbook recht langsam ab. auf meinem HeimPC natürlich massiv schneller, aber es müsste trozdem besser gehen.
Sprich irgendwelche Spiele, die zu komplexen meshes auch noch texturen etc bereitstellen, laufen auf dem gerät ja auch mit einigermaßen akzeptabler geschwindigkeit.Ich vermute einfach das es tricks gibt, die das ganze weniger rechenintensiv machen.
vorschläge?
-
Es gibt keine allgemeine Lösung, das "optimale Handling" hängt wohl von deinem konkreten Awendungsfall ab.
Wie groß ist denn ein solches Modell, bzw. um was für eine Art von Modell/Szene handelt es sich da genau? Wie genau renderst du deine Modelle?
-
das größte der 5 Meshes ist 5Mb groß, und hat 150.000 Zeilen, mit Vertexen, normalden etc. Gespeichert als X-File.
Die Meshes kommen haben folgenden weg hinter sich:
Autocat Inventor -> export STL -> Blender -> export X-fileGeladen werden die Meshes über:
HRESULT hr=D3DXLoadMeshFromX(xfiles[j], D3DXMESH_SYSTEMMEM, d3ddev, NULL, &materialBuffer, NULL, &lmesh[j].numMaterials, &lmesh[j].mesh );
und gespeichert in ein Structarray, dass global so definiert ist:
struct lmesh{ LPD3DXMESH mesh; DWORD numMaterials; D3DMATERIAL9* meshMaterials; LPDIRECT3DTEXTURE9* meshTextures; } lmesh[5];
In meiner Renderframe funktion passiert nicht viel.
Hier die Funktion:void render_frame(void){ unsigned long int i, j, k; for(i = 0; i < 4; i++){ if(data.index[i] == -90) data.dir[i] = -data.dir[i]; if(data.index[i] == 90) data.dir[i] = -data.dir[i]; data.index[i] += data.dir[i]; } d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); d3ddev->BeginScene(); D3DXMATRIX matView; D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3 (0.0f, 10.0f, 50.0f), // the camera position &D3DXVECTOR3 (0.0f, 0.0f, 0.0f), // the look-at position &D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction d3ddev->SetTransform(D3DTS_VIEW, &matView); D3DXMATRIX matProjection; D3DXMatrixPerspectiveFovLH (&matProjection, D3DXToRadian(45), (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, 1.0f, 200.0f); d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); D3DXMATRIX matScaleRel; D3DXMatrixScaling(&matScaleRel, 0.1f, 0.1f, 0.1f); for(i = 0; i < 6; i++){ for(j = 0; j < 4; j++){ data.angleset[i][j] = data.index[j]; } } for(k = 0; k < 6; k++){ for(i = 0; i < 5; i++) matrix(data.angleset[k],i,k); for(j = 0; j < 5; j++){ d3ddev->SetTransform(D3DTS_WORLD, &(matScaleRel * data.matAll[j])); for(i = 0; i < lmesh[j].numMaterials; i++) lmesh[j].mesh->DrawSubset(i); } } D3DXMatrixScaling(&matScaleRel, 3.0f, 0.7f, 5.0f); d3ddev->SetTransform(D3DTS_WORLD, &(matScaleRel)); for(i = 0; i < lmesh[5].numMaterials; i++) lmesh[5].mesh->DrawSubset(i); d3ddev->EndScene(); d3ddev->Present(NULL, NULL, NULL, NULL); }
macht eigentlich nicht mehr außer, 4 variablen von -90° bis 90° laufen zu lassen,
und mit der funktion matrix ein paar translations und ein paar rotationsmatrixen zu verrechnen.ich mach mich grade daran, die meshes zu vereinfachen. ich klau ihnen einfach mal einige vertexe. (welche die man aufgrund der verkleinerung kaum noch sehen wird)
-
Schau dir mal das an: http://msdn.microsoft.com/en-us/library/windows/desktop/bb174072.aspx
-
ich merk gerade das die meshes doch recht umfangreich sind.
sehr sehr hochauflösend. ich kann die meshes selbst nochmal um den faktor 20 verkleinern ohne das sie groß an form verlieren.aber das das sieht sehr gut aus!
ich werds auf jeden fall ausprobieren. danke!