Я использую Qt 5.4 и создание матрицы проекции и видовой экран следующим образом в моем resizeGL функции переопределения:QOpenGLWidget перекрывая матрицу проекции
glViewport(_off_x, _off_y, _width, _height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, _width, 0, _height, -1, 1);
я могу проверить это, и когда я распечатать проекционную матрицу следующим образом, он показывает правильное значение:
GLdouble projection[16];
glGetDoublev(GL_PROJECTION_MATRIX, projection);
// printing this shows the correct projection matrix.
Однако, где-то это становится переопределенным. Когда я печатаю матрицу проекции в функции paintGL(), она показывает ее как личность.
Интересно, что я переключился на старый QGLWidget, и он работает так, как ожидалось.
Прошу прощения, я не согласен. Я не уверен, почему мне нужно устанавливать проекцию и видовые экраны и все это каждый раз в вызове краски. Это совершенно не нужно. Старый виджет работает так, как ожидалось, и, на мой взгляд, новый сломан. Если вы устанавливаете матрицы видового экрана и проекции, виджет должен соблюдать это. – Luca
Кроме того, из qt docs (5.4): resizeGL() - Устанавливает область просмотра OpenGL, проекцию и т. Д. Получает вызов всякий раз, когда виджет был изменен (а также когда он отображается в первый раз, потому что все вновь созданные виджеты получают автоматически изменить размер). – Luca
@Luca: матрицы видового экрана и проекции являются переменными состояния OpenGL. Это совершенно нормально, и на самом деле очень часто многократно меняют свои ценности - например, каждый раз, когда вы видите миникарту, какую-то навигационную HUD или какое-то обзорное окно, это делается путем изменения окна просмотра и проецирования на полпути. Нигде в спецификации OpenGL не сказано, что фреймворки должны их уважать. Кроме того, GLUT запускал все беспорядки 'resizeGL' и' reshape', и с тех пор, как инфраструктура приложений, по-видимому, его разложила. – datenwolf