Qt использует ряд функций OpenGL для реализации своего 2D-рисования, включая пользовательские шейдеры и различные буферы кадров. Это ставит OpenGL в довольно запутанное состояние.
beginNativePainting
/ endNativePainting
позволяют механизму рисования Qt сохранять этот контекст и извлекать его после того, как пользователь закончит рисовать.
Было бы неплохо, если бы методы xxxNativePainting
делали наоборот (т. е. автоматически сохраняли и восстанавливали пользовательскую конфигурацию OpenGL), но поскольку Qt позволяет напрямую вызывать примитивы OpenGL, сохранение глобального состояния практически невозможно без кучи кода и потенциально серьезной производительности. хит.
Вместо этого эти методы просто сохраняют внутреннее состояние OpenGL Qt и, вместо запуска пользовательского кода в конфигурации, которая в любом случае была бы бессмысленной (и, вероятно, будет меняться с каждым новым выпуском Qt), сбрасывают OpenGL в «нейтральное» состояние.
Это означает, что внутри начального/конечного раздела вы начнете с чистого листа: нет связанных шейдеров, нет массива вершин, сброс большинства глобальных параметров и т. д.
В отличие от простого сценария QGLWidget
/PaintGL
, где вы можете позволить себе установить глобальное состояние OpenGL раз и навсегда и просто вызывать примитивы рендеринга в каждом кадре, вам придется восстанавливать почти все сразу после вызова beginNativePainting
(связать/связать ваш шейдеры, установка глобальных параметров, выбор и включение различных буферов и т. д.).
Это также означает, что вы должны экономно использовать нативную живопись. Если каждый отдельный виджет выполняет пользовательскую прорисовку, это может вскоре поставить ваш рендеринг на колени.
person
kuroi neko
schedule
11.05.2014