Pergunta

Allright - parece a minha pergunta era tão nebuloso como minha cabeça. Vamos tentar novamente.

Eu tenho 3 propriedades ao configurar viewports para um dispositivo D3D: - A resolução do dispositivo está sendo executado em (full-screen). - A relação de aspecto físico do monitor (como fracção e flutuador: 1, de modo que por ex 4: 3 & 1.33.). -. A relação entre a resolução fonte de aspecto (própria resolução fonte é uma espécie de moot e diz-nos pouco mais do que a relação de aspecto da prestação quer eo tipo de resolução que seria ideal para ser executado em)

Em seguida, nos deparamos com esta:

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

Agora, enquanto g_displayAspectRatio é igual a a proporção de Xres / neus (= adaptados de resolução do dispositivo), tudo está bem e este código vai fazer o que se espera dele. Mas assim que esses 2 valores não estão mais relacionados (por exemplo, alguém executa um 4: 3 resolução em uma tela 16:10, hardware-esticado) outro passo é necessário para compensar, e eu tenho dificuldade para descobrir como exatamente .

(e P.S. Eu uso moldes de estilo C em tipos atômicos, ao vivo com ele :-))

Foi útil?

Solução

Estou assumindo que você quer alcançar é uma projeção "quadrado", por exemplo, quando você desenhar um círculo que você quer olhar como um círculo em vez de uma elipse.

A única coisa que você deve jogar com é a sua relação de aspecto de projeção (câmera). Em casos normais, monitores manter pixels quadrado e tudo que você tem a fazer é definir a relação de aspecto câmera igual a relação de aspecto do seu visor:

viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;

No caso esticado você descreve (imagem 4: 3 esticado em uma tela 16:10 por exemplo), os pixels não são quadrados mais e você tem que levar isso em conta na sua relação de aspecto câmera:

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;

Onde screen_size_x e screen_size_y são múltiplos do tamanho real do monitor (por exemplo 16:10).

No entanto, você deve simplesmente supor pixels quadrados (a menos que você tenha um motivo específico não a), como o monitor pode relatar informações de tamanho físico incorretas ao sistema, ou há informações de todo. Também monitores nem sempre esticar, a mina por exemplo mantém. 1: relação de aspecto 1 pixels e adiciona bordas pretas para resoluções mais baixas

Editar

Se você quer ajustar a sua janela para alguns razão de aspecto e ajustá-lo em uma resolução arbitrária, então você poderia fazer assim:

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top