D3D - mehrere "viewports"

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Boomhower
Beiträge: 6
Registriert: 08.07.2008, 20:34

D3D - mehrere "viewports"

Beitrag von Boomhower »

Hallo,
ich bin leider weder mit Windows-Programmierung gut vertraut noch Direct3D-Experte. Zu dem Thema hab ich auch nach intensiver suche nichts brauchbares gefunden.
Ich bräuchte Starthilfe, wie ich es angehe, in mehrere "viewports" zu rendern. Also a la Level-Editor, mehrere Ansichten in einem Fenster zu haben. Muss ich einfach Unterfenster im Hauptfenster erstellen? und wenn ja welche (typ usw)? Ich will nicht in Texturen rendern, weil ich gern noch Windows-Steuerelemente benutzen würde.
Bei D3D10 ist ja die SwapChain so mit dem Device verbunden, dass ich nur ein Window handle angeben kann. Brauch ich also mehrere Devices?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: D3D - mehrere "viewports"

Beitrag von Schrompf »

Mehrere Devices definitiv nicht, die hacken sich gegenseitig. Mit D3D10 geht das vielleicht, mit D3D9 hast Du da heftige Performance-Einbußen.

Der Standardweg für einen Leveleditor dürfte wohl schlicht IDirect3DDevice9::SetViewport() sein. Damit wählst Du einen Teil der Fensterfläche aus und renderst da rein. Dann erneut SetViewport auf einen anderen Teil und nochmal rendern. Das Device erzeugst Du dafür mit der ganzen Fläche des Ziel-Widgets.

Für D3D9 und auch D3D10 gibt es aber auch die Möglichkeit, zusätzliche SwapChains zu erzeugen, die dann unabhängig voneinander dimensioniert werden können. Dann benutzt Du halt anstatt SetViewport() SetRenderTarget() und fertig.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: D3D - mehrere "viewports"

Beitrag von kimmi »

Es gibt ein Grundlagen-Tutorial auf GameDev, welches sich mit dem Thema beschäftigt. Allerdings benutzen die die MFC und OpenGL. Gerade von der MFC rate ich dringend ab, aber vielleicht kannst du ja einige interessante Infos über die Ideen dort finden:
http://www.gamedev.net/reference/articl ... le1358.asp

Gruß Kimmi
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: D3D - mehrere "viewports"

Beitrag von Stefan Zerbst »

Hi,

also in D3D9 gab es in der Device::Present Methode einen Parameter mit dem man das Handle des Zielfensters angeben konnte wenn man in ein anderes Fenster als das in den PRESENT_PARAMS angegebene rendern wollte. D3D10 habe ich noch nie probiert, würde aber vermuten, dass es da einen ähnlichen Mechanismus gibt. Es geht ja nur darum das fertige Bild in einem anderen Fenster anzuzeigen.

Ciao,
Stefan
Boomhower
Beiträge: 6
Registriert: 08.07.2008, 20:34

Re: D3D - mehrere "viewports"

Beitrag von Boomhower »

Hi, danke für die Antworten.
Also durch die MFC hab ich mich vor langer Zeit mal n bisschen gequält. Da ist meine Motivation momentan eher gering. Der Artikel ist leider nicht so einfach auf D3D übertragbar.
Wenn ich einfach den Viewport beschneide, malt zb. clear() immernoch das ganze fenster aus. Selbst wenn man das irgendwie hinbiegen könnte, werd ich nun mal mehrere Swapchains versuchen. Wäre mir doch lieber, D3D in klare ChildWindow-Schranken zu verweisen, auch wenn man da anscheinend wieder idxgifactorys braucht, um mehrere SwapChains zu erstellen.
Ist von D3D9->10 eigentlich irgendwas einfacher/weniger umständlich geworden, oder ist einfach nur der Laien-Hobby-Programmierer-Support wegoptimiert worden? :P Good ol' RenderStates, FixedFunctionPipeline etc.
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: D3D - mehrere "viewports"

Beitrag von Stefan Zerbst »

Boomhower hat geschrieben:... werd ich nun mal mehrere Swapchains versuchen. Wäre mir doch lieber, D3D in klare ChildWindow-Schranken zu verweisen, auch wenn man da anscheinend wieder idxgifactorys braucht, um mehrere SwapChains zu erstellen.
Wie gesagt: Ich würde fast erwarten, dass man irgendwo in D3D10 auch das Window-Handle angeben kann in welches gerendert werden soll. Da müsste man sich halt mal die entsprechenden Interfaces genau anschauen.
Boomhower hat geschrieben:Ist von D3D9->10 eigentlich irgendwas einfacher/weniger umständlich geworden, oder ist einfach nur der Laien-Hobby-Programmierer-Support wegoptimiert worden? :P Good ol' RenderStates, FixedFunctionPipeline etc.
Es ist nicht der Laien-Support wegoptimiert worden. Vielmehr hat man mit der Einführung von Vista das Treibermodell geändert und die Kommunikation zwischen dem Betriebssystem und dem Treiber. Zudem haben die Grafikkarten schon seit zwei, drei Generationen eigentlich gar keine FixedFunction Pipeline mehr, diese wurde quasi nur noch durch interne Shader der Grafikkarte emuliert.

Von daher ist D3D10 ein konsequenter Schnitt der alle alten Zöpfe der Grafikprogrammierung abschneidet.

[rant]OpenGL ist das leider mit seiner ach so dollen 3.0 Spec nicht gelungen ähnlich konsequent vorzugehen :mrgreen: [/rant]

Ciao,
Stefan
Boomhower
Beiträge: 6
Registriert: 08.07.2008, 20:34

Re: D3D - mehrere "viewports"

Beitrag von Boomhower »

Erstmal Danke,
ich werd nochmal durchschaun, wem man wo wie wann welche Handles angeben kann. Ansonsten eben mehrere SwapChains, sobald ich Zeit dafür hab.
Thx an alle
Tactive
Beiträge: 61
Registriert: 21.07.2004, 15:10
Kontaktdaten:

Re: D3D - mehrere "viewports"

Beitrag von Tactive »

Hallo,

interessantes Thema. Was mich dabei interessiert ist die Frage ob man dann für jeden Viewport einen eigenen Backbuffer braucht oder einfach die Bereiche durch mehrere Renderdurchläufe füllt??
Ansonsten kann ich nur das Buch "Introduction to 3D Game Programming with DirectX 10", welches gerade die Grundlagen gut erklärt. Alle anderen Bücher scheitern irgendwie an der DX10 Hürde.
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: D3D - mehrere "viewports"

Beitrag von Stefan Zerbst »

Hi,

man macht mehrere Durchläufe in dasselbe RenderTarget und presented dann in unterschiedliche Fenster. Wenn man mehrere Swapchains verwendet kostet das natürlich je nach Auflösung eine Menge an Speicher. Bei einer einzigen Swapchain muss man natürlich bedenken, dass diese von der Auflösung her dem größten der verwendeten Fenster angepasst sein muss.

Ciao,
Stefan
Boomhower
Beiträge: 6
Registriert: 08.07.2008, 20:34

Re: D3D - mehrere "viewports"

Beitrag von Boomhower »

Hi,
also wenn ne Möglichkeit existiert, das Ausgabe-Fenster von ner SwapChain zu ändern, kann ich diese leider nicht endtecken.
Man gibt einmal beim erstellen der SwapChain das DXGI_SWAP_CHAIN_DESC::OutputWindow an. An der SwapChain kann man dieses soweit ichs gesehen hab nachträglich nicht mehr ändern. Und ein Viewport selber agiert wohl auch nur innerhalb des einen OutputWindows. Der Present() aufruf nimmt auch keine Parameter an, die in die Richtung gehen. Im RenderTarget setzt man ja auch nur den BackBuffer von ner bestimmten SwapChain.
Dem Chef ungern wiedersprechen wollend überblick ich das ganze so, dass man wohl so viele SwapChains wie OutputWindows braucht...
<edit>Lass mich aber gern eines besseren belehren</edit> :)
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: D3D - mehrere "viewports"

Beitrag von Stefan Zerbst »

Hi,

hier gibt es keinen Chef, ist alles Anarchie :mrgreen:

Es mag durchaus sein, dass es diese Option in DX10 nicht mehr gibt. Ich hänge immer noch auf dem Stand von DX9. Es verwundert mich nur ein wenig, dass das nicht mehr so einfach geht. Dann scheint es wohl so zu sein, dass man multiple SwapChains haben muss. Aber heutzutage hat man ja eh 1024 MB VRAM :lol:

Ciao,
Stefan
Antworten