2

わかりました - 私の質問は私の頭と同じくらい曇っていたようです。もう一度試してみましょう。

D3D デバイスのビューポートを構成する際に 3 つのプロパティがあります。 - デバイスが実行されている解像度 (フルスクリーン)。- モニターの物理的な縦横比 (分数と浮動小数点数: 1、例: 4:3 & 1.33)。- ソースの解像度の縦横比 (ソースの解像度自体は意味がなく、レンダリングが必要とする縦横比と実行するのに理想的な解像度の種類以外はほとんどわかりません)。

次に、これに遭遇します:

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

g_displayAspectRatio が xRes/yRes の比率 (= デバイスの解像度から適応) に等しい限り、すべて問題なく、このコードは期待どおりに動作します。しかし、これらの 2 つの値が関連しなくなるとすぐに (たとえば、誰かが 16:10 の画面で 4:3 の解像度をハードウェア ストレッチで実行すると)、補正するために別の手順が必要になります。 .

(そしてps私はアトミック型でCスタイルのキャストを使用し、それと一緒に暮らします:-))

4

1 に答える 1

3

達成したいのは「正方形」の投影であると想定しています。たとえば、円を描くときに、楕円ではなく円のように見せたいとします。

操作する必要があるのは、投影 (カメラ) の縦横比だけです。通常、モニターはピクセルを正方形に保ち、カメラの縦横比をビューポートの縦横比と同じに設定するだけです。

viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;

あなたが説明する引き伸ばされたケース (たとえば、16:10 の画面で引き伸ばされた 4:3 の画像) では、ピクセルはもはや正方形ではなく、カメラの縦横比でそれを考慮する必要があります。

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_xscreen_size_yはモニターの実際のサイズの倍数です (例: 16:10) 。

ただし、モニターがシステムに誤った物理サイズ情報を報告するか、まったく情報を報告しない可能性があるため、(特別な理由がない限り) 単純に正方形ピクセルを想定する必要があります。また、モニターは常に引き伸ばされるとは限りません。たとえば、私のモニターは 1:1 のピクセル縦横比を維持し、解像度が低い場合は黒い境界線を追加します。

編集

ビューポートをある縦横比に調整し、任意の解像度に合わせたい場合は、次のようにすることができます。

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;
于 2009-08-04T00:52:58.237 に答える