Problem beim Rendern mit unterschiedlichen Texturen.
-
Hallo. Ich schreibe ein Programm mit DirectX9 und C++. Ich will eine große ebene Fläche mit Grastextur unter mir generieren und 5 Schilder, die jeweils eine Textur mit ihrer Nummer haben darauf. ohne Texturen so weit so gut. Ich nutze Vertex- und IndexBuffer.
Bisher habe ich beim initialisieren der Dreiecke jedes dieser Vierecke mit
IDirect3DDevice9::SetTexture ( 0 , pd3dTexture );
die Texturen gesetzt, die dann beim rendern eingesetzt wurden. In diesem Beispiel brauche ich aber 6 verschiedene Texturen und jedes Schild als auch der GrasBoden müssen mit einer anderen Textur gerendert werden. Beim initialisieren der Dreiecke scheint sich aber nicht die Textur die beim speichern der Texturkoordinaten aktiv war mitzuspeichern und im Endeffekt zu rendern, sondern für alle Dreiecke die beim rendern aktive Textur einzusetzen und dementsprechend alles mit ein und der selben Textur zu rendern. Wie kann ich jetzt die 5 Schilder und den Boden mit der richtigen Textur rendern lassen, wenn alle Vertizes aller Dreiecke in ein und dem selben VertexBuffer liegen?
Vielen Dank.
-
Ich glaub du hast da was falsch verstanden. Die Textur die "beim Speichern der Texturkoordinaten aktiv war" (was auch immer das genau heißen soll) interessiert Direct3D absolut gar nicht.
Die Texturen die du mit SetTexture() setzt sind die, die beim Rendern verwendet werden. Und die werden so lange verwendet bis du andere setzt.Du wirst deine Objekte nacheinander rendern müssen.
Erst die erste Textur setzen, dann das erste Objekt rendern.
Dann die zweite Texture setzen und das zweite Objekt rendern.
...Dass die Vertices von all den Objekten im selben Buffer liegen ist kein Problem. Welche Vertices verwendet werden hängt ja nicht nur vom VertexBuffer ab, sondern auch von den Paramtern von Draw*Primitive()
-
Danke,
habs jetzt hinbekommen. Ich hatte mich schon gewundert, wieso man all diese Indizen mit initialisieren muss. Aber die brauche ich ja nun nicht mehr.
Fazit: knappe 30 Zeilen übersichtilicher und voll Funktionsfähig.
danke
-
FrEsHdFaN1 schrieb:
Ich hatte mich schon gewundert, wieso man all diese Indizen mit initialisieren muss.
Was genau meinst du damit?
-
ich habe vorher mit DrawIndexedPrimitive gearbeitet und als D3DPT_TRIANGLELIST rendern lassen, aber da ich ja alles so im Speicher habe, dass auch als TRIANGLESTRIP funktioniert, kann ich jetzt (ohne Indexed) den IndexBuffer komplett weg lassen
-
Der IndexBuffer ist aber alles Andere als umsonst...
-
Mal gleich noch eine Frage: Ich hab jetzt zwei GameModes eingebaut, einer der läuft wenn das Programm im Vordergrund ist und das Bild rendert und einer der läuft, solange ich in anderen Fenstern arbeite. Wenn ich wieder in das Fenster von dem Programm switche, bekomme ich aber nur noch einen White Screen (oder BlankScreen). Ich ändere die GameModes über die WM_KILLFOCUS und WM_SETFOCUS funktionen. Wenn ich aber den Focus auf mein Fenster richte und der GameMode zu GM_RENDER (also das spiel soll gerendert werden) wechselt und eigentlich jetzt wieder gerendert werden müsste, bekomme ich wie gesagt nur einen Weissen bildschirm zu gesicht.
Wollte dafür nicht extra einen neuen Thread aufmachen, vielleicht kannst du mir ja helfen.
-
Ich vermute mal dass das dein Problem ist: http://msdn.microsoft.com/en-us/library/windows/desktop/bb174714.aspx