Na gut - meine Frage war wohl so unklar wie mein Kopf. Versuchen wir es noch einmal.
Ich habe 3 Eigenschaften beim Konfigurieren von Ansichtsfenstern für ein D3D-Gerät: - Die Auflösung, in der das Gerät läuft (Vollbild). - Das physikalische Seitenverhältnis des Monitors (als Bruchteil und float:1, also z.B. 4:3 & 1.33). - Das Seitenverhältnis der Quellauflösung (Quellauflösung selbst ist eine Art von moot und sagt uns wenig mehr als das Seitenverhältnis der Rendering will und die Art der Auflösung, die ideal wäre, in laufen).
Dann stoßen wir auf Folgendes:
// -- figure out aspect ratio adjusted VPs --
m_nativeVP.Width = xRes;
m_nativeVP.Height = yRes;
m_nativeVP.X = 0;
m_nativeVP.Y = 0;
m_nativeVP.MaxZ = 1.f;
m_nativeVP.MinZ = 0.f;
FIX_ME // this does not cover all bases -- fix!
uint xResAdj, yResAdj;
if (g_displayAspectRatio.Get() < g_renderAspectRatio.Get())
{
xResAdj = xRes;
yResAdj = (uint) ((float) xRes / g_renderAspectRatio.Get());
}
else if (g_displayAspectRatio.Get() > g_renderAspectRatio.Get())
{
xResAdj = (uint) ((float) yRes * g_renderAspectRatio.Get());
yResAdj = yRes;
}
else // ==
{
xResAdj = xRes;
yResAdj = yRes;
}
m_fullVP.Width = xResAdj;
m_fullVP.Height = yResAdj;
m_fullVP.X = (xRes - xResAdj) >> 1;
m_fullVP.Y = (yRes - yResAdj) >> 1;
m_fullVP.MaxZ = 1.f;
m_fullVP.MinZ = 0.f;
Solange nun g_displayAspectRatio ist gleich das Verhältnis von xRes/yRes (= angepasst an die Geräteauflösung), ist alles in Ordnung und der Code tut, was von ihm erwartet wird. Aber sobald diese 2 Werte nicht mehr zusammenhängen (zum Beispiel, jemand läuft eine 4:3 Auflösung auf einem 16:10 Bildschirm, Hardware-gestreckt) ist ein weiterer Schritt erforderlich, um zu kompensieren, und ich habe Schwierigkeiten herauszufinden, wie genau.
(und p.s ich verwende C-ähnliche Casts auf atomare Typen, leben Sie damit :-) )