DirectX11 - in mehrere Fenster rendern

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

DirectX11 - in mehrere Fenster rendern

Beitrag von Raven280438 »

Hi,

als Grundlage dient dieses Tutorial.

Meine Frage: Wie muss ich das umbauen, um in mehrere Fenster rendern zu können? Ich muss für jedes Fenster eine Swapchain und ein RenderTargetView erstellen.

1.) Wie schaut es mit dem DepthStencilBuffer aus? Reicht da einer, oder für jede Swapchain einen? Gleiches für den DepthStencilState und -View. Wofür genau sind die da?

2.) Welche Methoden muss ich aufrufen, wenn ich in verschiedene Fenster rendern?

Code: Alles auswählen

m_deviceContext->OMSetDepthStencilState(m_depthStencilState, 1);
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView);
m_deviceContext->RSSetState(m_rasterState);
m_deviceContext->RSSetViewports(1, &viewport);
Welche Methoden muss ich zwischen SwapChain1->Present() und SwapChain2->Present() aufrufen. Oder muss ich sie nur einmal beim Erstellen aufrufen?


Ich hoffe ich habe meine Fragen einigermaßen verständlich gestellt. ;)

Gruß
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von dot »

Raven280438 hat geschrieben:Meine Frage: Wie muss ich das umbauen, um in mehrere Fenster rendern zu können? Ich muss für jedes Fenster eine Swapchain und ein RenderTargetView erstellen.
Ja
Raven280438 hat geschrieben:1.) Wie schaut es mit dem DepthStencilBuffer aus? Reicht da einer, oder für jede Swapchain einen? Gleiches für den DepthStencilState und -View. Wofür genau sind die da?
Meist wird zumindest prinzipiell ein DepthStencilBuffer reichen. Der DepthStencilState konfiguriert, was genau der Depth Test und Stencil Test machen. Das DepthStencilView ist analog zum RenderTargetView...
Raven280438 hat geschrieben:2.) Welche Methoden muss ich aufrufen, wenn ich in verschiedene Fenster rendern?
Du musst eben die entsprechenden RenderTargets setzen und was auch immer du rendern willst dort reinrendern!?
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von Raven280438 »

Hi,

danke für die Antwort.
Du musst eben die entsprechenden RenderTargets setzen und was auch immer du rendern willst dort reinrendern!?
Das ist mir schon klar.

Ich weis nur nicht, ob ich die Methoden vor jedem Rendern aufrufen muss, oder ob die beim Erstellen schon irgendwie an die jeweilige SwapChain gebunden sind.


Gruß
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von dot »

Raven280438 hat geschrieben:Ich weis nur nicht, ob ich die Methoden vor jedem Rendern aufrufen muss, oder ob die beim Erstellen schon irgendwie an die jeweilige SwapChain gebunden sind.
Um welche Methoden geht es konkret?
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von Raven280438 »

Hi,

die Methoden, wie oben beschrieben:

Code: Alles auswählen

m_deviceContext->OMSetDepthStencilState(m_depthStencilState, 1);
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView);
m_deviceContext->RSSetState(m_rasterState);
m_deviceContext->RSSetViewports(1, &viewport);
Ob noch welche dazu kommen weis ich noch nicht, bin bei den Tutorials erst bei Lektion 3 (Initialisierung) ;)


Gruß
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von dot »

Naja, spätestens wenn du mehrere Swap Chains und damit mehrere Render Targets hast, wirst du das wohl zwangsweise immer wieder setzen müssen, da du es ja wirst durchwechseln wollen!? Oder arbeitest du mit mehreren Device Contexts?
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von Raven280438 »

Hi,

nein, ich hab nur einen Context.
Naja, spätestens wenn du mehrere Swap Chains und damit mehrere Render Targets hast, wirst du das wohl zwangsweise immer wieder setzen müssen,
Ok danke, genau das wollte ich wissen ;)
Ich wusste halt nicht, ob immer die "Einstellungen", die grad im Context gesetzt sind, zum Rendern genommen werden, oder ob die "Einstellungen" beim Erstellen irgendwie an die SwapChain gebunden werden.

Eine (zukünfige (soweit bin ich noch nicht, nur Interesse-halber)) Frage hab ich noch:
Wenn ich die Größe des Fensters verändere, dann muss ich alle Buffer Release-en und mit der neuen Größe neu erstellen? Und Viewport neu setzen und g_pSwapChain->ResizeBuffers() aufrufen?



Gruß
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von dot »

Raven280438 hat geschrieben:Ich wusste halt nicht, ob immer die "Einstellungen", die grad im Context gesetzt sind, zum Rendern genommen werden, oder ob die "Einstellungen" beim Erstellen irgendwie an die SwapChain gebunden werden.
Der DeviceContext repräsentiert im Prinzip einfach nur den ganzen momentanen State, der zum Rendern verwendet wird. Es zählt immer nur das, was aktuell gesetzt ist.
Raven280438 hat geschrieben:Wenn ich die Größe des Fensters verändere, dann muss ich alle Buffer Release-en und mit der neuen Größe neu erstellen? Und Viewport neu setzen und g_pSwapChain->ResizeBuffers() aufrufen?
Richtig, vergiss nicht, auch alle Views zu Releasen, da jedes Views selbst auch eine Referenz auf seine Ressource hält...
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von Raven280438 »

Hi,

wäre es nicht sinnvoller, für jede Swapchain nen eigenen Context zu nehmen?
Oder gibt es dann andere Probleme, von denen ich (noch) nichts weis?


Gruß
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von dot »

Mehrere Contexts auf der selben Grafikkarte machen beispielsweise dann Sinn, wenn du multithreaded Rendering betreiben willst. Wenn du gerade erst am Anfang stehst, würd ich das aber erstmal bleiben lassen und mit einem Context arbeiten... ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: DirectX11 - in mehrere Fenster rendern

Beitrag von Krishty »

dot hat geschrieben:
Raven280438 hat geschrieben:1.) Wie schaut es mit dem DepthStencilBuffer aus? Reicht da einer, oder für jede Swapchain einen? Gleiches für den DepthStencilState und -View. Wofür genau sind die da?
Meist wird zumindest prinzipiell ein DepthStencilBuffer reichen.
Naja – spätestens wenn die Fenster unterschiedliche Antialiasing-Einstellungen nutzen braucht man einen pro Fenster. Ich würde es schon allein deshalb empfehlen, weil dann weniger Abhängigkeiten der Fenster untereinander bestehen (sonst müsste bei jedem Vergrößern und Verkleinern ermittelt werden, welches das größte befüllte Fenster ist).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten