Backbuffer Größe zur Laufzeit ändern
-
Hi! Mein Programm läuft im Fenster Modus, und man kann die größe des Fensters verschieben, jedoch wird die Backbuffer größe nicht automatisch angepasst. Ich Frage mich wie man die Backbuffer größe zur laufzeit ändern kann? Ich benutze Direct3D9.
-
Dazu musst du mit IDirect3DDevice9::Reset() das Device neu initialisieren mit geänderter Backbuffer Höhe und Breite.
Ist natürlich wenig effizient, wenn du bei dem Schritt das Gerät neu initialisierst, daher solltest du nicht während dem Resize das Device neu initialisieren, sondern erst, wenn der Benutzer fertig ist.Und dann ist noch zu überlegen ob man es nicht einfach deaktiviert, denn ein langsames Größenändern wirkt immer schlechter auf den Benutzer, als wenn es gar nicht geht.
-
Es gäbe aber noch eine andere möglichkeit, man kann den Backbuffer ja auch auf einer festen Größe lassen, beispielsweise 1280x800, und dann in ein Childfenster der selben Größe zeichnen. Wenn man nun die Größe ändert wird einfach das Childfenster verschoben
-
Code-Walker schrieb:
Es gäbe aber noch eine andere möglichkeit, man kann den Backbuffer ja auch auf einer festen Größe lassen, beispielsweise 1280x800, und dann in ein Childfenster der selben Größe zeichnen. Wenn man nun die Größe ändert wird einfach das Childfenster verschoben
?
Meinst du zufällig folgendes: Backbuffer größer als das Fenster machen (optimalerweise die native Auflösung des Monitors) und dann per Viewport einfach in einen kleinen Bereich rendern der die Größe des Fensters hat und dann auch nur diese Ausschnitt im Fenster anzeigen?
-
Ja sowas in der Art! Ich kenne mich mit den DX Viewports nicht gut (eigentlich garnicht) aus, muss dann nochmal schauen wie das geht wie du das meinst.
-
Code-Walker schrieb:
Ja sowas in der Art! Ich kenne mich mit den DX Viewports nicht gut (eigentlich garnicht) aus, muss dann nochmal schauen wie das geht wie du das meinst.
Das einzige wo ich mir nicht sicher bin bei meiner Idee ist die Backbuffer-Größe und ob man diese größer als das zugehörige Fenster machen kann. Müsstest du mal ausprobieren.
Die Viewports zu benutzen ist ganz einfach, einfach mal IDirect3DDevice9::SetViewport anschauen
-
S.T.A.L.K.E.R. schrieb:
Code-Walker schrieb:
Ja sowas in der Art! Ich kenne mich mit den DX Viewports nicht gut (eigentlich garnicht) aus, muss dann nochmal schauen wie das geht wie du das meinst.
Das einzige wo ich mir nicht sicher bin bei meiner Idee ist die Backbuffer-Größe und ob man diese größer als das zugehörige Fenster machen kann. Müsstest du mal ausprobieren.
Es gibt kein "zugehöriges Fenster" in dem Sinn. Es gibt das Focus-Window und das Device-Window - keines der beiden begrenzt allerdings die Back-Buffer Form durch seine Grösse (wäre ja auch ziemlich irre, da sich die Fenster-Grösse ja jederzeit ändern kann).
-
Ich habe es nun so gemacht das ich Das zu zeichnende Fenster die Größe der aktiven Desktopauflösung gebe und davon dann die linke position des Fensters abziehe. Der Backbuffer hat natürlich die selbe größe wie das Fenster in dem gezeichnet wird.
Das sieht dann so aus:
http://www9.picfront.org/picture/8ZF5dskj/img/00000000001x.pngFunktioniert eigentlich ganz gut, und bis ich eine bessere Möglichkeit gefunden habe wird das noch standhalten