DirectX 9 - Eine Textur in Originalgröße rendern
-
Hi.
Ich versuche gerade eine 400x200 Pixel große Textur in nativer Größe zu rendern.
Leider hab ich bisher nicht den richtigen Anstoß bei Google gefunden.Derzeitig render ich die Textur so:
m_d3ddev->SetTransform (D3DTS_WORLD, &m_identity); m_d3ddev->SetTransform (D3DTS_VIEW, &m_identity); m_d3ddev->SetTransform (D3DTS_PROJECTION, &m_identity); m_d3ddev->SetTexture(0, *m_meshTextures[0]); for(i = 0; i < m_mesh[0].numMaterials; i++) // m_mesh[0] ist ein einfaches Quadrat. { m_d3ddev->SetMaterial(&m_mesh[0].meshMaterials[i]); m_mesh[0].mesh->DrawSubset(i); }
Die Textur wird jetzt über den gesamten Schirm gespannt.
Ich würde sie aber gerne in ihren 400x200 Pixel mittig zentriert rendern. Aber wie?
-
Da Du jetzt ja ueberall die Einheitsmatrix gesetzt hast, fuellt ein Polygon von -1..+1 das Fenster komplett aus.
Du musst also einfach dafuer sorgen, dass Dein Polygon nur von +/- 400/FensterBreite und 200/Fensterhoehe reicht, zB indem Du eine entsprechende Skalierungsmatrix setzt.
-
Also Gesammtgröße (1920) durch 400 = 4,8.
...dann 1 / 4,8 = 0.208. usw...
und damit dann die Eckpunkte des Polygon neu berechnen?
oder gibt es irgendwie etwas schöneres, wo ich nur Pixel angeben muss?ich berechne es jetzt wie folgt:
fact_x = 1/((float)data->get_INI()->Data()->Screen_Width/411); //411 ist die richtige Bereite der Textur fact_y = 1/((float)data->get_INI()->Data()->Screen_Height/200); D3DXMatrixScaling (&mat_size, fact_x, fact_y, 1); temp = m_identity * mat_size; m_d3ddev->SetTransform (D3DTS_WORLD, &temp); m_d3ddev->SetTransform (D3DTS_VIEW, &m_identity); m_d3ddev->SetTransform (D3DTS_PROJECTION, &m_identity);
Die Textur wird jetzt in ihrer richtigen Größe dargestellt, aber eben nicht scharf... es sind Pixelfehler etc zu sehen.
Ich stelle mich gerade die Frage ob das vlt. an der Auflösung des Programmes liegt. Denn es ist nicht exact full HD. Muss ich exact den 16:9 Faktor zwischen Height und Width einhalten? oder darf ich da rumspielen und es muss trotzdem so aussehen?, wenn ja habe ich ein Problem, denn wenn ich mal wirklich seltsame Werte eingebe ist auch der Rest des Programms sehr sehr hässlich.
-
cl90 schrieb:
gibt es irgendwie etwas schöneres, wo ich nur Pixel angeben muss?
Wenn man mit Pixelkoordinaten arbeiten moechte, setzt man sich ueblicherweise eine orthographische Projektionsmatrix in der das Koordinatensystem genau von 0..Fensterbreite, 0..Fensterhoehe geht.
Die Textur wird jetzt in ihrer richtigen Größe dargestellt, aber eben nicht scharf...
Dann moechtest Du den Texturfiltermodus von linear auf nearest setzen.
es sind Pixelfehler etc zu sehen.
Pixelfehler?
Ich stelle mich gerade die Frage ob das vlt. an der Auflösung des Programmes liegt. Denn es ist nicht exact full HD. Muss ich exact den 16:9 Faktor zwischen Height und Width einhalten?
Wenn Du eine feste Aspectratio haben willst aber die Fenstergroesse beliebig veraendert werden darf, musst Du den Viewport eben so einstellen, dass nur ein zentrierter Bereich mit der gewuenschten Aspectratio verwendet wird.
Dh wenn das Fenster breiter ist, laesst Du rechts und links einen Rand (Pillarbox) und wenn das Fenster hoeher ist, eben oben und unten (Letterboxing).