PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multisampling in Direct3D 9 Swapchains


Neomi
2005-11-02, 15:09:28
Für einen Editor mit einer vierfach unterteilten Ansicht nutze ich vier Swapchains (Direct3D 9), die Device-implizite Swapchain ist dabei nur ein recht niedrig aufgelöster Dummy. Wenn ich jetzt für die einzelnen Swapchains Multisampling zuschalten will, geht das nicht wie erwartet, zumindest nicht auf meiner Radeon 9800 Pro. Nur die zuerst erstellte Swapchain (von denen, die Multisampling anfordern) bekommt Multisampling, die anderen bleiben pixelig. Das Reference-Device bietet Multisampling für alle Swapchains, also wird es wohl ein Treiberfehler (Version scheint egal zu sein) sein.

Gibt es vielleicht einen programmiertechnischen Workaround zu diesem Problem? Gefunden habe ich zumindest noch nichts.

Nebenbei noch eine zweite Frage, auch wenn die nicht viel mit Programmierung zu tun hat...
Wie kann man eigentlich das Oktoberupdate 2005 vom DirectX 9 SDK unter Windows 2000 installieren? Eingestellter Support ist eine Sache, die Verweigerung der Installation und Zwang zu XP eine andere. Die entpackten Dateien funktionieren zwar, aber eine saubere Installation wäre mir doch lieber.

Demirug
2005-11-02, 15:18:01
Für einen Editor mit einer vierfach unterteilten Ansicht nutze ich vier Swapchains (Direct3D 9), die Device-implizite Swapchain ist dabei nur ein recht niedrig aufgelöster Dummy. Wenn ich jetzt für die einzelnen Swapchains Multisampling zuschalten will, geht das nicht wie erwartet, zumindest nicht auf meiner Radeon 9800 Pro. Nur die zuerst erstellte Swapchain (von denen, die Multisampling anfordern) bekommt Multisampling, die anderen bleiben pixelig. Das Reference-Device bietet Multisampling für alle Swapchains, also wird es wohl ein Treiberfehler (Version scheint egal zu sein) sein.

Gibt es vielleicht einen programmiertechnischen Workaround zu diesem Problem? Gefunden habe ich zumindest noch nichts.

Bekanntes Problem. ATI hat mit Multisampling Rendertargets im allgemeinen große Probleme.

Kannst du mal einen Screenshot machen wie das mit den 4 Ansichten aussehen soll? Ich habe da vielleicht eine Idee.

Coda
2005-11-02, 16:47:48
http://www.mvps.org/directx/articles/rendering_to_multiple_windows.htm

Das ist zwar für DX8, aber der nimmt für die primäre swapchain das ganze Bild. Keine Ahnung ob das hilft, aber probier es doch mal aus.

Neomi
2005-11-02, 16:50:32
Bekanntes Problem. ATI hat mit Multisampling Rendertargets im allgemeinen große Probleme.

Etwas in der Richtung hatte ich befürchtet. Ich bin da zwar Perfektionist, aber zur Not geht es auch ohne Multisampling.

Kannst du mal einen Screenshot machen wie das mit den 4 Ansichten aussehen soll? Ich habe da vielleicht eine Idee.

Sicher. Momentan bastel ich noch am Editor-Framework (wozu alles doppelt machen...), das Projekt mit dem eigentlichen Editor und der Direct3D-Ansteuerung ist noch recht klein und enthält fast nur Platzhalter zum Funktionstest des Frameworks.

http://img84.imageshack.us/img84/7362/editor3zp.th.jpg (http://img84.imageshack.us/my.php?image=editor3zp.jpg)

Ich vermute mal, deine Idee geht in die Richtung, eine einzelne Swapchain zu haben, von der immer nur der passende Teil genutzt wird.

Demirug
2005-11-02, 17:10:25
Sicher. Momentan bastel ich noch am Editor-Framework (wozu alles doppelt machen...), das Projekt mit dem eigentlichen Editor und der Direct3D-Ansteuerung ist noch recht klein und enthält fast nur Platzhalter zum Funktionstest des Frameworks.

http://img84.imageshack.us/img84/7362/editor3zp.th.jpg (http://img84.imageshack.us/my.php?image=editor3zp.jpg)

Ich vermute mal, deine Idee geht in die Richtung, eine einzelne Swapchain zu haben, von der immer nur der passende Teil genutzt wird.

Ich habe in meiner Engine ein ähnliches Problem (Splitscreenrendering) und da es auch Vollbild laufen muss benutzte ich nur einen Swapchain. Das geht sogar sehr gut mit Direct3D.

Da du aber recht aufwendige Titelleisten über deinen Views hast würde das aufwendiger werden da diese ja dann auch gerendert werden müssten.

Neomi
2005-11-02, 17:23:43
http://www.mvps.org/directx/articles/rendering_to_multiple_windows.htm

Das ist zwar für DX8, aber der nimmt für die primäre swapchain das ganze Bild. Keine Ahnung ob das hilft, aber probier es doch mal aus.

Nur der ZBuffer, ansonsten sind es auch einzelne Swapchains. Ich kann mir aber denken, was für eine Variante du meinst, daran hatte ich auch schonmal gedacht: Rendern mit passendem ViewPort und dann mit entsprechendem SourceRect in das Zielfenster kopieren. Copy als SwapEffect wird nichtmal unbedingt langsamer sein als Discard, zumindest nicht im Fenstermodus. Was mich davon abgehalten hat, war der Zwang zu einem Pixelformat und identischen Multisampling-Settings für alle Fenster.

Coda
2005-11-02, 17:35:06
Nein nein:
d3dpp.BackBufferFormat = mode.Format;
d3dpp.BackBufferWidth = mode.Width;
d3dpp.BackBufferHeight = mode.Height;Der Backbuffer geht über den ganzen Bildschirm.

Neomi
2005-11-02, 17:49:57
Nein nein:
d3dpp.BackBufferFormat = mode.Format;
d3dpp.BackBufferWidth = mode.Width;
d3dpp.BackBufferHeight = mode.Height;Der Backbuffer geht über den ganzen Bildschirm.

Das schon, aber:

m_pSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&pBack);
g_pd3dDevice->GetDepthStencilSurface(&pStencil);
g_pd3dDevice->SetRenderTarget(pBack,pStencil);

Der große Backbuffer wird nicht benutzt, nur der dazugehörige ZBuffer.

Neomi
2005-11-02, 17:57:39
Da du aber recht aufwendige Titelleisten über deinen Views hast würde das aufwendiger werden da diese ja dann auch gerendert werden müssten.

Das wäre auch mit einem simplen Header schwierig geworden. Die Fensterklasse, die diese Unterteilung macht, weiß nichts von Direct3D und ist in einem anderen Projekt enthalten. Meine Hoffnung war, daß es irgendeinen Workaround für das Multisampling-Problem mit mehreren Swapchains gibt. Es können nämlich auch noch Floater dazukommen, die eine weitere Swapchain benötigen, die würde dann in den Einzelbackbuffer nicht mehr unbedingt reinpassen.

Danke euch beiden für die Hinweise. Die verschiedenen Lösungsmöglichkeiten haben aber leider wieder andere Nachteile, das Hauptproblem (Treiber) läßt sich wohl nicht so einfach umgehen. Immerhin wird das Multisampling rein optional zuschaltbar sein und in den Rechnern unserer Grafiker werkeln hauptsächlich nVidia-Karten. Es ist quasi nur ein nicht sonderlich tragischer Schönheitsfehler...