نسب الارتفاع - كيفية التعامل معها؟(إعداد منفذ العرض ثلاثي الأبعاد)

StackOverflow https://stackoverflow.com/questions/1222340

سؤال

حسنًا - يبدو أن سؤالي كان غائمًا مثل رأسي.لنجرب مجددا.

لدي 3 خصائص أثناء تكوين منافذ العرض لجهاز D3D:- الدقة التي يعمل بها الجهاز (ملء الشاشة).- نسبة العرض إلى الارتفاع المادية للشاشة (ككسر وعائم: 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 (= مقتبسة من دقة الجهاز)، كل شيء على ما يرام وسيقوم هذا الكود بما هو متوقع منه.ولكن بمجرد أن لا تعود هاتان القيمتان مرتبطتين (على سبيل المثال، يقوم شخص ما بتشغيل دقة 4:3 على شاشة 16:10، ممتدة بالأجهزة) يلزم اتخاذ خطوة أخرى للتعويض، وأواجه مشكلة في معرفة مدى دقة ذلك .

(وملاحظة: أستخدم القوالب ذات النمط C على الأنواع الذرية، وتعايش معها :-))

هل كانت مفيدة؟

المحلول

أفترض أن ما تريد تحقيقه هو إسقاط "مربع"، على سبيل المثال.عندما ترسم دائرة، فأنت تريد أن تبدو كدائرة بدلاً من شكل بيضاوي.

الشيء الوحيد الذي يجب أن تلعب به هو نسبة العرض إلى الارتفاع (الكاميرا) الخاصة بك.في الحالات العادية، تحافظ الشاشات على مربع البكسل وكل ما عليك فعله هو ضبط نسبة العرض إلى الارتفاع للكاميرا الخاصة بك بما يساوي نسبة العرض إلى الارتفاع لإطار العرض الخاص بك:

viewport_aspect_ratio = viewport_res_x / viewport_res_y;
camera_aspect_ratio = viewport_aspect_ratio;

في الحالة الممتدة التي تصفها (صورة 4:3 ممتدة على شاشة 16:10 على سبيل المثال)، لم تعد وحدات البكسل مربعة وعليك أن تأخذ ذلك في الاعتبار في نسبة العرض إلى الارتفاع للكاميرا:

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 و screen_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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top