DirectX 9 LPD3DXMESH Textur
-
Hallo,
lade in meinem Code eine Textur für ein CUSTOMVERTEX was auch sehr gut funktioniert.D3DXCreateTextureFromFile(d3ddev, L"1234.JPG", &pTexture); d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); d3ddev->SetTexture(0, pTexture);
Das Problem mein LPD3DXMESH(Sphere)bekommt jetzt die gleiche Textur.
Ich kann die TexturStage bei der zweiten Textur so setzen das sie über die erste geladen wird(also vermischt) aber ich will halt zwei einzelne Texturen
Kann mir jemand da weiter helfen?
-
ElTorro schrieb:
D3DXCreateTextureFromFile(d3ddev, L"1234.JPG", &pTexture); d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); d3ddev->SetTexture(0, pTexture);
Ein bisschen mehr Code wäre hilfreich. Setzt du überhaupt die andere Textur in der Pipeline als aktuelle Textur, wenn du das zweite Mesh zeichnest?
Ich frage das, weil der Code, so wie er da oben steht, nahelegt, dass du eventuell nur einmal nach dem Laden der Textur die Pipeline konfigurierst und die Textur aktivierst - dann haben natürlich alle Objekte, die du im Render-Loop zeichnest dieselbe Textur.
Ich habe zwar wenig Erfahrung mit DX9 (nur DX10+/OGL), aber üblichwerweise sieht das Rendering mit Grafik-APIs schematsich etwa so aus:ladeTexturen() { textur1 = lade("tex1") // D3DXCreateTextureFromFile textur2 = lade("tex2") } render() { pipelineKonfigurieren() // SetTextureStageState aktiviereTextur(textur1) // SetTexture zeichneMesh(mesh1) aktiviereTextur(textur2) // SetTexture zeichneMesh(mesh2) swapBuffers() } main() { ladeTexturen() while (programmLäuft) { render() } }
-
Danke für die Hilfe,
ich hab das mit der zweiten Textur jetzt so gelöst.Mein Code vom Sphere sieht so aus
void Sphere(void) { //Load Circle in Scene LPDIRECT3DVERTEXBUFFER9 CloneVertexBuffer; D3DXCreateSphere(d3ddev, 5.0f, 50, 50, &CloneMesh,NULL); // // Clone the original sphere mesh and make it red... // CloneMesh->CloneMeshFVF(0, CUSTOMFVF, d3ddev, &CircleMesh); if (SUCCEEDED(CircleMesh->GetVertexBuffer(&CloneVertexBuffer))) { CUSTOMVERTEX *pVertices = NULL; int nNumVerts = CircleMesh->GetNumVertices(); CloneVertexBuffer->Lock(0, 0, (void**)&pVertices, 0); { } CloneVertexBuffer->Unlock(); CloneVertexBuffer->Release(); } //Texture D3DXCreateTextureFromFile(d3ddev, L"556.JPG", &a_Texture); d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); //Ignored d3ddev->SetTexture(0, a_Texture); D3DXMATRIX Circle; D3DXMatrixTranslation(&Circle, -TextPosiX, -TextPosiY, NWMoving); d3ddev->SetTransform(D3DTS_WORLD, &(Circle*matRotateY)); CircleMesh->DrawSubset(0); }
Meine Texturen werden jetzt zwar geändert aber mein Grafikspeicher läuft voll(ungefähr in 200MB schritten) bis zum absturz.
Woran kann das liegen ich habe eigentlich alle Meshes und VertexBuffer Released?
Problem mit dem Speicher hat sich gelöst.
Die erste Textur wurde an falscher stelle geladen .
Aber jetzt funktioniert die zweite Textur wieder nicht .Wenn ich die Texturen nach Beginn Scene(); im meinem Code lade werden sie richtig angezeigt aber der Speicher läuft voll.
-
ElTorro schrieb:
Woran kann das liegen ich habe eigentlich alle Meshes und VertexBuffer Released?
Und die Textur? Wird die auch wieder freigegeben? Sehe keinen Code dahigehend.
Und so nebenbei: Laden einer Datei (Textur) von Datenträger und "Draw" in der selben Funktion sieht etwas gruselig aus. Ich hoffe dir ist bewusst, dass wenn du mit Sphere() ein paar hundert Kugeln innerhalb eines Render-Loops zeichnen willst, du keine allzu berauschenden Frameraten erwarten kannst?Auch für das "klonen" des Vertex Buffer und das "Mapping" in den Arbeisspeicher mittels Lock() (einmal durch den Bus von GPU-Speicher in den Arbeitsspeicher) hat hoffentlich einen guten Grund ... keine Sorge, der PCIe-Bus ist schnell genug für sowas, aber Spieleentwickler sind schon ziemliche Performance-Fanatiker
Finnegan
-
Danke für die Hilfe,
hab das Problem jetzt so gelöst.Einfach eine If abfrage vor dem zeichnen und laden der Textur.
if (TRUE) { d3ddev->SetTexture(0, p_Texture); render(); }
Die Texturen gebe ich beim beenden frei und lade sie jetzt nicht zusammen beim zeichnen.
Danke für den Tipp.