C# D3D Textur pixelgenau auf den Screen rendern?

MPi

Cadet 2nd Year
Registriert
Mai 2011
Beiträge
23
Hallo :)

Ich probiere mich gerade an PostProcessing Effekten unter D3D9 und habe dabei das Problem, dass ich eine berechnete Textur nicht exakt 1:1 auf den Bildschirm bekomme. Gibt es dabei einen Trick?

Die Textur hat dabei exakt die größe des Bildschirms in Pixeln (hier 1920x1080).
Ich rendere die Szene in diese Textur, wende dann 5 verschiedene Pixelshader an, die jeweils wieder in eine neue Textur gerendert werden und versuche dann die Ergebnistextur exakt auf den Bildschirm zu bringen. Hierbei kommt es zu einem leichten Zoomeffekt pro Iteration, das Bild wird also leicht unscharf.

Der relevante Quellcode um das Rechteck auf den Schirm zu bringen sieht so aus:

D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian(45.0f ),1.0f,0.1f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3 (0.0f,0.0f,2.589), // camera position
&D3DXVECTOR3 (0.0f,0.0f,5.0f), // the look-at position
&D3DXVECTOR3 (0.0f,1.0f,0.0f)); // the up direction
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

D3DXMatrixTranslation(&matTrans, 0.0f, 0.0f, 5.0f );
D3DXMatrixRotationYawPitchRoll(&matRot , 0.0f, 0.0f, 0.0f );
matWorld = matRot * matTrans;
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

"DrawQuad"

Mir ist klar, dass ich mich mit der Camera-Position von 2.589 nur angenähert habe, leider habe ich bisher kein gutes Beispiel gefunden, wie ich das ganze exakt auf den Bildschirm bringe.

Hat jemand einen guten Hinweis?

Danke!
 
Wie hast du denn die Position angenähert? Von Hand?
Ich würd denken, dass man das ausrechnen muss indem man den Blickwinkel (Fov) berücksichtigt und dann einen passenden Abstand wählt - mittig sollte sich ja von selbst erklären.
Alternativ evtl. 2D? Ka obs das bei Direct3D gibt^^
 
Bei DirectX werden ja alle Verices in eine 3D Box der Tiefe 1 und der Höhe und Breite 1 hineintransformiert.
Wenn du nun jede Matrix auf die Einheitsmatrix setzt und dann die Vertices auf 0,0 0,1 1,0 1,1 und z-Wert=egal setzts, dann müsste es doch gehen... (Oder hab ich nen Denkfehler?)
 
@kuddelmuddl:
Ja, die Position habe ich "von Hand" angenähert, was natürlich eine höchst unschöne Lösung ist. Sie ist zwar nah dran, aber leider immernoch ungenau.

Obs da was mit 2D gibt... ich habe noch nichts gefunden, was aber nichts heißen muss, bin erst gute 2 Wochen in D3D unterwegs.

@Blitzmerker:
Ich habe das ausprobiert. Das Resultat war, dass ich schlicht nichts gesehen habe und es mir auch nicht gelungen, etwas mit den Matrizen auf den Bildschirm zu bekommen. Man bräuchte im Prinzip so etwas wie eine Parallelprojektion der Textur auf den Bildschirm.

Jedenfalls schonmal danke für Eure Antworten.
Wenn noch jemand einen guten Tip hat, gern her damit :)

Grüße
 
http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B4.aspx

Da wird beispielsweise ohne Verrechnung der Koordinaten direkt gezeichnet (also nicht normalisiert sondern schon in Screencoordinates).
Ein bisschen Doku lesen und schon sollte es eine Textur sein, die auf das komplette Rendertarget gezeichnet wird.

In DirectX 10 würde ich mit eine VertexShader einfach die Werte weitergeben und dann im Pixelshader fetch(texcoord.xy) aufrufen. Je nachdem, wie weit dein Projekt ist, könntest du das auch machen.
Dabei wäre der Typ POSITION wichtig.
 
@Blitzmerker:
Das Tutorial http://www.directxtutorial.com/Tutor...ics/dx9B4.aspx ist im Prinzip ja genau was ich mache, ich lege die Textur auf 2 Dreiecke und rendere die in den Bildschirm. Mit einem Unterschied. Die setzen dort weder die Projection/World/View Matrix.

Wenn ich das bei mir probiere, also
- BeginScene
- MatrixIdentity für Projection, View, World
- DrawPrimitive
bleibt mein Bildschirm schlicht leer.

Auch das weglassen der SetTransform wie im Tutorial führt nur zu einem leeren Bildschirm
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
d3ddev->SetFVF(CUSTOMFVF);
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); //my Quad
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}

So langsam habe ich den Verdacht, dass ich entweder zu dusselig dafür bin, oder es schlicht nicht geht (was ich mir eher nicht vorstellen kann ^^)
 
Zuletzt bearbeitet:
Ich habe noch weiter rumgespielt, einige weitere Tutorials ausprobiert, immer mit dem Ergebnis die Tetxur niemals exakt 1:1 auf den Bildschirm zu bekommen. (Bin wohl doch zu dusselig ^^)

Danke für Eure Hilfe
 
Wie gesagt - kann man die exakten Werte für die Koordinaten nicht errechnen? Für mich hört sich das nach Mittelstufen-Mathe an: Trigonometrie & evtl Satz des Pythagoras.
So im Sinne von
"Wie weit muss eine Wand mit Größe [größe einsetzen] von einer Kamera mit Blinkwinkel [fov einsetzen] entfernt sein, um exakt das gesamte Blickfeld auszufüllen"
 
wären das dann nicht eher strahlensätze?^^
 

Ähnliche Themen

Zurück
Oben