Korrekt in mehrere Swap Chains rendern
-
Aber mit einem Fenster geht es? Warum sind überhaupt 4 Fenster nötig?
P.S.: Du hast zu wenig fett geschrieben!
Bye, TGGC (Der Held ist zurück)
-
Hi,
die Hässlichkeit kommt daher, weil die BackBuffer mit Sicherheit nicht exakt die Grösse haben die der Client-Bereich des Fensters hat mit dem die Swap Chain verbunden ist.
Wenn das der Fall ist dann skaliert die WinAPI das Bild entsprechend und dabei kommt dieser Müll heraus. Wenn Du die Swap-Chains erstellst dann setze die Height und Width der Present-Parameters auf 0, dann holt sich Direct3D die jeweils korrekte Grösse automatisch. Wenn Du die Fenster resized musst Du die Swap Chain neu erstellen. Daher ist es auch einfacher die interne Swap Chain nicht zu verwenden, sondern vier eigene zu erstellen.
Beachte, dass der Depth-Buffer mindestens so gross sein muss wie man das Fenster maximal skalieren kann, sonst muss man den auch jeweils neu erstellen.
Ciao,
Stefan
-
@Stefan Zerbst:
Danke für den Hinweis mit der Breite, nur hab ich die BackBufferWidth und Height schon auf 0 gesetzt, und es kommt trotzdem zu den Fehlern. Bei einem weiteren Probelauf kam es zu einem regelrehten Schnee im Fenster (so als würde ich Clear nicht aufrufen, es schlägt aber auch nicht fehl).
Was könnte es noch sein?
Es soll ein Renderprogramm werden, deshalb die vier Fenster!
Ich benutze D3DSWAPEFFECT_COPY, bei FLIP flimmert es, scheint also nicht so gut zu sein.
-
Ach ja, hier noch der Initialisierungscode, vielleicht hab ich da ja nen dicken Schnitzer drin:
ZeroMemory(&stPresParms, sizeof(D3DPRESENT_PARAMETERS)); stPresParms.BackBufferWidth = 0; stPresParms.BackBufferHeight = 0; stPresParms.BackBufferFormat = stBitsPixel; stPresParms.BackBufferCount = 1; stPresParms.MultiSampleType = D3DMULTISAMPLE_NONE; stPresParms.SwapEffect = D3DSWAPEFFECT_COPY; stPresParms.hDeviceWindow = g_h3D; stPresParms.Windowed = true; stPresParms.EnableAutoDepthStencil = false; stPresParms.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; if (FAILED(pstD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &stPresParms, &pstDevice))) { fout << "Kritischer Fehler: Kreierung des Devices fehlgeschlagen!\n"; return false; } pstDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pstBackBuffer0); stPresParms.hDeviceWindow = g_hXYFront; pstDevice->CreateAdditionalSwapChain(&stPresParms, &pstChain1); pstChain1->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pstBackBuffer1); stPresParms.hDeviceWindow = g_hXZTop; pstDevice->CreateAdditionalSwapChain(&stPresParms, &pstChain2); pstChain2->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pstBackBuffer2); stPresParms.hDeviceWindow = g_hYZSide; pstDevice->CreateAdditionalSwapChain(&stPresParms, &pstChain3); pstChain3->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pstBackBuffer3);Grüße
JensE
-
Hi,
Du musst die Width und Height nach jedem Aufruf von IDirect3dDevice9::CreateDevice oder IDirect3DDevice9::CreateAdditionalSwapChain jeweils wieder auf 0 setzen, denn diese Funktionen setzen die tatsächliche Höhe und Breite in der Present Parameters Struktur. Deine Fenster habe also alle die Grösse des erstens Fensters. So lange die folgenden drei Fenster eine andere Grösse haben ist das ein Fehler.
Ciao,
Stefan
-
Das war auch nicht die Lösung, zuerst hab ich es einfach so gemacht, wie du vorgeschlagen hast, und dann hab ich mir einfach mal ausgeben lassen, ob CreateDevice() oder CreateAdditionalSwapChain() die Werte von Width und Height verändern, was nicht der Fall war.
Die Lösung war: Man muss auch Clear() für jede SwapChain einzeln aufrufen, nachdem man das Render Target gesetzt hat, so hat es zumindest bei mir funktioniert.
@Stefan: Danke vor allem für den Tipp mit dem Depth Buffer.
Sehr gutes Forum!

-
Hi,
der Wert wird schon neu in die Struktur geschrieben. Nur wenn, wie bereits oben erwähnt, alle vier Fenster bei Dir die gleiche Width/Height haben sieht man das eben nicht. Daher ist es sinnvollen vor jedem Aufruf die Variablen wieder auf 0 zu setzen

Ciao,
Stefan
-
JensE schrieb:
Es soll ein Renderprogramm werden, deshalb die vier Fenster!
Warum muss ein Renderprogramm 4 Fenster haben?
Bye, TGGC (Der Held ist zurück)
-
Kannst du mal den vollständigen Code posten? Bei mir hakt da noch was, aber ich weiß nocht nicht was, daher würde ich gerne sehen wie du das gemacht hast...

-
Hehe, nach 'nem Jahr kann meine Frage immer noch nicht beantwortet werden.
Bye, TGGC (Keine Macht den Dummen)
-
? I don't know about what you speak.

-
Sachmal, gibt es diesen Jens B oder wie er heißt eigentlich noch?

Oder hat jemand andeses mal aus seiner App nen example wie man das machen kann. Bei mir geht alles gut bis ich eine der Funktionen aufrufe ^^
-
Hat ihn nen Auto überfahren
Hat denn jemand anderes nen Funktionierenden Code? meiner stürzt immer ab.