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