Неправильное расположение сетки после запуска приложения (это исправляет только изменение размера окна)

#opengl #glfw

#opengl #glfw

Вопрос:

Скорее всего, это не проблема, а особенность конфигурации окна перед его созданием, но у меня следующая проблема. Сразу после запуска моего приложения моя модель смещается и растягивается, но она сразу же встает на место, как только я начинаю изменять размер окна. Я написал следующий обратный вызов для изменения размера окна:

 void framebuffer_size_callback(GLFWwindow *window, int w, int h) {
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
       glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,
          1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
    else
       glOrtho (-1.5*(GLfloat)w/(GLfloat)h,
          1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
  

Сразу после запуска приложения GLFW:
Сразу после запуска приложения GLFW

Размер окна немного изменен: Размер окна немного изменен

У меня не было подобных проблем с перенасыщением…

Комментарии:

1. Если кого-нибудь интересует полный код: github.com/glfw/glfw/issues/1767

2. Я не вижу, где вы устанавливаете свой GL_PROJECTION , кроме как из вашей функции изменения размера. Вероятно, вам также следует сделать это при запуске программы

3. @Thrasher, я добавил glMatrixMode (GL_PROJECTION); glLoadIdentity(); (и даже скопировал полный код обратного вызова в цикле рендеринга с фиксированными значениями w = 800 и h = 600), но ничего не изменилось. Я новичок в OpenGL, так что, возможно, я вас неправильно понял.

4. Прошу прощения. Но нет времени подробно просматривать ваш код. Но я почти уверен, что ваш опубликованный код не является проблемой.

Ответ №1:

Я использовал glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE) для правильного размера окна на дисплее с высоким разрешением Retina, но для вызова glViewport() я пропускаю старые немасштабированные ширину и высоту. Решение заключается в том, чтобы получить текущий размер буфера кадров с помощью glfwGetFramebufferSize() и передать эти размеры glViewport() вместо этого, и он должен отображаться правильно.