Seite 1 von 1

DirectX11 - in mehrere Fenster rendern

Verfasst: 18.12.2013, 20:53
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ß

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 07:07
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!?

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:05
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ß

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:08
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?

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:12
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ß

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:15
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?

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:29
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ß

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:37
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...

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:42
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ß

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 19.12.2013, 10:49
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... ;)

Re: DirectX11 - in mehrere Fenster rendern

Verfasst: 20.12.2013, 08:39
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).