OpenGL : 크기 조정 디스플레이 및 glOrtho / glViewport


16

나는 여러 출처에서이 질문을 연구했지만 아직 "정확한 생각이다"또는 "아니오.

OpenGL 렌더링과 해상도 독립성을 보장하려고합니다. 내가 그것에 대해 생각 해야하는 방법은 glOrtho내가 원하는 세계 좌표를 사용하여 투영을 만드는 것입니다. 예를 들면 다음과 같습니다 glOrtho(-50.0, 50.0, -50.0, 50.0, 1.0, -1.0). 다음으로, 뷰포트를 화면 해상도 , 즉-로 설정하십시오 glViewport(0, 0, 800, 600). 마지막으로, 창의 크기를 조정할 때마다 glViewport업데이트 된 화면 해상도로 전화하십시오. 이것은 당신의 수치를 조정합니다.

모델이 다른 해상도에서 동일한 화면 공간 비율을 갖도록하는 올바른 방법입니까? 해상도와 동일한 투영을 사용해야합니까? 나는 glOrtho당신의 창문 해상도를 사용해야 한다고 말하는 반면 다른 사람들은 그것이 달라야한다고 대답했습니다.

생각?

답변:


20

설명한 내용은 해상도 독립성을 제공하기에 전적으로 적절하고 적합 합니다. 당신이 그리는 것은 실제로 항상 같은 비율의 창을 차지합니다.

그러나이 이상을 수행하지 않으면 종횡비 문제가 발생합니다. 예를 들어, 쓴 숫자가 주어지면 원을 그리면 수평 스케일이 800 / (50 + 50) = 8이고 수직 스케일이 600 / (50+이기 때문에 키가 큰 것보다 넓습니다. 50) = 6.

이 문제에 대한 자동 해결책은 없습니다 . 원하는 그래픽 결과를 선택하고 게임 플레이에 미치는 영향을 고려해야합니다. 몇 가지 일반적인 예 :

  • HUD가없는 투시 투영 3D 게임에서 일반적인 간단한 솔루션 (의 일부로 OpenGL에서 사용 가능 gluPerspective)은 수직 치수를 기준으로 투영 시야를 고정시키는 것입니다. 입니다. 즉, 이러한 게임에서 창의 크기를 가로로 조정하면 장면의 어느 정도가 보이고 이미지의 중간 부분이 전혀 바뀌지 않습니다.

    동일한 아이디어를 2D / 2.5D 뷰에도 적용 할 수 있습니다.

    (이로 인해 플레이어는 넓지 만 키가 크지 않은 창을 만들어 시야를 가로로 확대 할 수 있습니다. 경쟁이 치열한 멀티 플레이어 게임에서는 원치 않을 수 있습니다.)

  • 가로 세로 비율이 고정 된 뷰포트로 채워진 그래픽이 있거나 (예 : 스크롤하지 않는 2D 맵 또는 장식 테두리) 레이아웃을 변경할 수없는 경우 두 개에 검은 막대가있는 것과 같은 작업을 수행해야합니다 사용하지 않는 공간을 채우기 위해 측면.

    또는 가장자리 주변에 주제 적으로 일관된 필러 재료가있는 그래픽을 만들 수 있습니다. 립니다 게임 플레이를 해치지 않고 디스플레이에 맞게합니다.

  • 다른 그래픽 위에 HUD가있는 경우 각 HUD 요소가 창의 일부 (왼쪽 위, 아래쪽 가운데 등)에 고정되어 좌표를 계산할 수 있습니다. 다양한 종횡비의 '스트레칭'은 HUD 요소 사이의 '공백'에 의해 흡수됩니다.

문제의 특정 수학에 관해서는 해상도 독립성을 고려할 때 시작해야 할 종횡비는 단일 숫자 width / height입니다. 예를 들어, 창이 정사각형이면 1이됩니다. 800 x 600이면 800/600 = 4/3 = 1.333̅입니다.

예를 들어, 창을 넓히면 왼쪽과 오른쪽에 추가 공간을 확보하기 위해 작성한 직교 투영법 을 원한다고 가정하십시오 . 다음과 같이 할 수 있습니다.

float aspect = width / height;
glViewport(0, 0, width, height);
glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);

이를 통해 창 높이가 최소 인 창에 대해 -50에서 50 사이의 x 및 y 좌표로 그리는 모든 것을 볼 수 있습니다.

반면에, 창이 키보다 좁 으면 -50에서 50까지의 범위가 잘립니다. 항상 표시되도록 (창이 정사각형이면 컨텐츠가 최대 크기이지만 그렇지 않은 경우에는 더 작게) 확인하고 싶다고 가정 해 봅시다. 이 경우 너비 대신 높이와 동일한 작업을 수행하면됩니다.

float aspect = width / height;
glViewport(0, 0, width, height);
if (aspect >= 1.0)
  glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);
else
  glOrtho(-50.0, 50.0, -50.0 / aspect, 50.0 / aspect, 1.0, -1.0);

두 번째 경우에는 곱하기보다는 나눕니다. 이것은 단순히 종횡비를 계산 width / height하지 않고 계산했기 때문입니다 height / width. 그 방법을 이해하기가 더 쉽다면 상호를 취하십시오.

다시 말하지만 이것이 종횡비를 관리하는 유일한 방법은 아닙니다. 콘텐츠가 손상되거나 잘리지 않도록하기위한 매우 간단한 방법입니다. 그림 밖으로 오류가 발생하는 것이 당신의 창이 넓은 높이, 또는 어떤 경우; 그런 다음 수학을 연습하십시오.


매우 통찰력있는 답변에 감사드립니다. 충분히 넘어서 내 질문에 대답했다.
크리스 헨더슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.