Question

D'accord, il me semble que ma question était aussi trouble que ma tête. Essayons encore.

J'ai 3 propriétés lors de la configuration des fenêtres pour un périphérique D3D: - La résolution du périphérique en cours d'exécution (plein écran). - Le rapport de forme physique du moniteur (en fraction et en volume: 1, donc par exemple 4: 3 et 1,33). - Le rapport hauteur / largeur de la résolution source (la résolution source elle-même est un peu discutable et n’indique qu’un peu plus que le rapport hauteur / largeur souhaité par le rendu et le type de résolution idéale).

Ensuite, nous rencontrons ceci:

// -- 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;

Maintenant, tant que g_displayAspectRatio est égal à le rapport xRes / yRes (= adapté de la résolution du périphérique), tout va bien et ce code fera ce qui est attendu de lui. Mais dès que ces deux valeurs ne sont plus liées (par exemple, quelqu'un exécute une résolution 4: 3 sur un écran 16:10, matériel étendu), une autre étape est nécessaire pour compenser, et j'ai du mal à comprendre comment .

(et p.s j'utilise des casts de style C sur des types atomiques, vivre avec :-))

Était-ce utile?

La solution

Je suppose que vous souhaitez obtenir un "carré". projection, par exemple lorsque vous dessinez un cercle, vous souhaitez le faire ressembler à un cercle plutôt qu’à une ellipse.

La seule chose avec laquelle vous devriez jouer est votre rapport de format de projection (caméra). Dans des cas normaux, les moniteurs gardent les pixels carrés et il vous suffit de définir le rapport hauteur / largeur de votre appareil photo égal au rapport hauteur / largeur de votre fenêtre:

viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;

Dans le cas étiré que vous décrivez (image 4: 3 étirée sur un écran 16:10 par exemple), les pixels ne sont plus carrés et vous devez en tenir compte dans le rapport de format de votre appareil photo:

stretch_factor_x = screen_size_x / viewport_res_x;
stretch_factor_y = screen_size_y / viewport_res_y;
pixel_aspect_ratio = stretch_factor_x / stretch_factor_y;
viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio * pixel_aspect_ratio;

screen_size_x et screen_size_y sont des multiples de la taille réelle du moniteur (par exemple 16:10).

Cependant, vous devez simplement supposer des pixels carrés (sauf si vous avez une raison spécifique non à), car le moniteur peut signaler des informations de taille physique incorrectes au système, ou aucune information. De plus, les moniteurs ne s'étirent pas toujours, le mien, par exemple, conserve un format d'image de 1: 1 pixels et ajoute des bordures noires pour les résolutions inférieures.

Modifier

Si vous souhaitez ajuster votre fenêtre d'affichage à un rapport de format et l'adapter à une résolution arbitraire, procédez comme suit:

viewport_aspect_ratio = 16.0 / 10.0; // The aspect ratio you want your viewport to have
screen_aspect_ratio = screen_res_x / screen_res_y;

if (viewport_aspect_ratio > screen_aspect_ratio) {
    // Viewport is wider than screen, fit on X
    viewport_res_x = screen_res_x;
    viewport_res_y = viewport_res_x / viewport_aspect_ratio;
} else {
    // Screen is wider than viewport, fit on Y
    viewport_res_y = screen_res_y;
    viewport_res_x = viewport_res_y * viewport_aspect_ratio;
}

camera_aspect_ratio = viewport_res_x / viewport_res_y;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top