opengl - 한글 - 태블릿 화면 비율



OpenGL에서 가로 세로 비율 스트레칭 (2)

전체 화면 모드에 문제가 있습니다. 내 창을 800x600으로 설정할 수 있지만 전체 화면 해상도로 설정하면 확대됩니다. 이것은 종횡비의 변화 때문이라고 생각합니다. 이 문제를 어떻게 해결할 수 있습니까?

# 1 편집

여기 내가 무슨 일이 벌어지고 있는지 보여주는 스크린 샷입니다.

왼쪽 : 800x600

오른쪽 : 1366x768

2 번 수정

내 initGraphics 함수는 창 크기를 재조정 할 때마다 호출됩니다 (WM_SIZE).

void initGraphics(int width, int height) {
    float aspect = (float)width / (float)height;
    glViewport(0, 0, width, height);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND); //Enable alpha blending
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, width, height * aspect, 0.0);
    glMatrixMode(GL_MODELVIEW);
}

https://ffff65535.com


창 크기를 조정 한 후에는 새로운 종횡비를 반영하도록 투영 행렬을 조정해야합니다. 클래식 OpenGL을 사용하는 경우 행렬 모드를 GL_PROJECTION으로 전환하고 항등 행렬을로드 한 다음 가로 세로 비율로 조정 한 세로 치수가있는 glOrtho 또는 gluPerspective를 호출합니다 (이미지의 가로 스프레드가 원래 창에 있었다).


해결책 : 실제 문제는 gluOrtho2D 기능을 잘못 사용하고 있다는 결론을 내 렸습니다. 이것을 사용하는 대신 :

gluOrtho2D(0.0, width, height * aspect, 0.0);

올바른 양식으로 전환해야했습니다.

gluOrtho2D(0.0, width, 0.0, height);

후자는 뷰포트의 전체 너비와 높이를 채우는 2D 직교 투영법을 작성하므로 스트레칭이 발생하지 않습니다.

원래의 답변 :

새로운 종횡비를 고려하여 프로젝션을 수정해야합니다.

먼저 glViewport 를 새 창 크기로 설정하십시오. 뷰포트가 설정되면 glMatrixMode 호출하여 매트릭스 모드를 투영으로 전환 한 다음 최종적으로 width / height 새 종횡비를 계산하고 gluPerspective 새 종횡비를 전달해야합니다. glFrustum 대신에 직선 glFrustum 사용하여 gluPerspective 과 동일한 효과를 얻기 위해 gluPerspective 소스를 찾을 수 있습니다.

이 같은:

    float aspectRatio = width / height;
    glMatrixMode(GL_PROJECTION_MATRIX);
    glLoadIdentity();
    gluPerspective(fov, aspectRatio, near, far); 




aspect-ratio