Правильное использование 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){ ... } 

};