2015-05-14 3 views
0

Я использую 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, и он работает так, как ожидалось.

ответ

4

Однако, где-то это становится переопределенным. Когда я печатаю матрицу проекции в функции paintGL(), она показывает ее как личность.

И вы удивительно, почему? Qt5 может использовать OpenGL для рисования своих файлов. Это означает, что Qt должен будет установить состояние контекста OpenGL в соответствии с его потребностями.

То, что вы наблюдали, - это то, что следует ожидать, поэтому не удивляйтесь.

Я использую Qt 5.4 и создание матрицы проекции и видовой экран следующим образом в моем resizeGL функции переопределения:

Вы не должны делать это. Как и в любой системе, основанной на состоянии, важно правильно установить состояние, когда оно вам нужно, в том, что вам нужно - или отслеживать все изменения состояния, что намного сложнее.

Выполните правильные шаги и переместите все, что вы сделали, в resizeGL, где он находится: paintGL. Единственная цель: resizeGL - обновлять ресурсы, такие как рендеринг буферов FBO, и отражать новый размер. Но не используйте его для установки связанного с графикой состояния OpenGL.

+0

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

+0

Кроме того, из qt docs (5.4): resizeGL() - Устанавливает область просмотра OpenGL, проекцию и т. Д. Получает вызов всякий раз, когда виджет был изменен (а также когда он отображается в первый раз, потому что все вновь созданные виджеты получают автоматически изменить размер). – Luca

+2

@Luca: матрицы видового экрана и проекции являются переменными состояния OpenGL. Это совершенно нормально, и на самом деле очень часто многократно меняют свои ценности - например, каждый раз, когда вы видите миникарту, какую-то навигационную HUD или какое-то обзорное окно, это делается путем изменения окна просмотра и проецирования на полпути. Нигде в спецификации OpenGL не сказано, что фреймворки должны их уважать. Кроме того, GLUT запускал все беспорядки 'resizeGL' и' reshape', и с тех пор, как инфраструктура приложений, по-видимому, его разложила. – datenwolf

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