Правильное использование QOpenGLFunctions
Я в настоящее время работаю над использованием модуля Qt5 gui для доступа к функциям OpenGL.
Тогда я открываю QOpenGLFunctions
что полезно, потому что :
- он обертывает OpenGL для рабочего стола и OpenGL ES, убедившись, что я использую API OpenGL "портативным" способом.
- мне не нужно беспокоиться о включении заголовков OpenGL, Qt делает это за меня.
но у меня есть сомнения относительно правильного способа его использования.
В следующих строках перечислены только три способа, о которых я знаю. используя этот класс.
Мой вопрос: есть ли хороший способ использовать QOpenGLFunctions
?
наследование от QOpenGLFunctions
официальная документация Qt говорит: "унаследуйте класс от QOpenGLFunctions
и используйте классы glXXXX, как раньше. Но мне не нравится такой способ как :
- если мой класс должен был наследовать от другого класса раньше, я должен сделать мульти-наследование. То,чем я не являюсь. Даже когда такие случаи безопасны в любом случае, это aestethics...
- все классы glXXXX оклейку константным. Я все методы с использованием OpenGL должен быть константным. Это не делает много смысла. Да
OpenGLFunctions
класс может законно быть неконст, когда я делаюglClear(...)
, но почему мой методDrawableShape::render(...)
будет ?
и о inherinting от QOpenGLFunctions
. Его конструктор может принимать аргумент: текущий контекст OpenGL. Этот параметр кажется мне очень важным, но никакая документация Qt не вызывает этот конструктор. Вместо этого они позволяют компилятору выбрать конструктор без параметров.
С QOpenGLFunctions
как
другая идея должна быть иметь экземпляр QOpenGLFunctions
как член любого класса, вызывающего функции glXXXXX или, по крайней мере, ссылку на один экземпляр, и вызывающего все функции OpenGL из этого экземпляра.
передает QOpenGLFunctions
в качестве параметра
для каждой функции, использующей OpenGL, вызывающий абонент отправляет QOpenGLFunctions
. Таким образом :
void renderRectangle(QOpenGLFunctions& opengl) const;
но как я мог быть уверен этой функция будет нуждаться в нем и этой никто не хочет ? Я имею в виду, что исходный код будет становиться больше к тому времени, и я боюсь риска увидеть все методы классов, получающих этот параметр...
1 ответов
следуя тому же принципу других объектно-ориентированных библиотек оболочек, вы можете рассмотреть небольшую вариацию ваших третьих вариантов.
определите класс, представляющий текущий контекст opengl, который также расширяет QOpenGLFunctions
class GL : public QOpenGLFunctions{
QGLContext& context;
GL(QGLContext& c) : glContext(c){ ... }
};
поток рендеринга инициализирует экземпляр GL, предоставляя его текущий контекст, и передает его всем экземплярам рендеринга, которым необходимо выполнить операции opengl. Таким образом, вы также уверены, что не смешиваете несколько контекстов при инициализации и использовании структур и буферов opengl.
class Visualizer{
void glInit(GL& gl){ ... }
void glPaintOpaque(GL& gl){ ... }
void glPaintTranslucent(GL& gl){ ... }
};