2009-08-03 4 views
2

Все в порядке - кажется, мой вопрос был таким же облачным, как и моя голова. Давай попробуем снова.Соотношение сторон - как обойти их? (D3D viewport setup)

У меня есть 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 (= адаптированными от разрешения устройства), все хорошо, и этот код будет делать то, что ожидается Это. Но как только эти 2 значения больше не связаны (например, кто-то работает с разрешением 4: 3 на экране 16:10, аппаратно-растянутый), для компенсации требуется еще один шаг, и мне трудно понять, как именно ,

(и p.s я использую C-стиле бросает на атомарных типов, жить с ним :-))

+0

Используйте 'static_cast', кстати. – GManNickG

+0

Я не понимаю, что именно вы пытаетесь сделать. –

+0

Rewrote вопрос. – nielsj

ответ

3

Я предполагаю, что вы хотите достичь в «квадрат» проекцию, например, когда вы рисуете круг, вы хотите, чтобы он выглядел как круг, а не эллипс.

Единственное, с чем вам нужно играть, это соотношение сторон проекции (камеры). В обычных случаях, мониторы держать пиксели квадратные и все, что вам нужно сделать, это установить соотношение сторон камеры равным соотношением сторон вашего видового экрана:

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; 
+0

Спасибо за ответ. Ваше предположение является частично правильным, но я должен добавить к этому, что я также придерживаюсь определенного соотношения сторон (или формата экрана) для 2D-компоновки - как и для ex. широкоэкранный фильм. В отличие от игры, я не оценил вариант создания визуальных образов, которые выглядели бы хорошо в любой пропорции. Ваш намек не беспокоиться о неквадратных пикселях довольно обнадеживает (думал об этом), но с учетом соотношения пикселей является хорошим. – nielsj

+0

Отредактированный ответ, чтобы добавить «произвольное соотношение сторон видового экрана на произвольное разрешение экрана». –

+0

И что о суммах до того, что делает код сейчас (я понимаю, что я не вставлял какой-либо код на то, как я обрабатывал пропорции проекции, которые могли бы быть полезны, поскольку это было уже хорошо) :) Но достаточно справедливо, спасибо ! – nielsj

 Смежные вопросы

  • Нет связанных вопросов^_^