首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用QOpenGLFunctions

正确使用QOpenGLFunctions
EN

Stack Overflow用户
提问于 2014-06-09 14:47:52
回答 1查看 5.2K关注 0票数 10

我目前正在使用Qt5 gui模块访问OpenGL函数.然后我发现QOpenGLFunctions是有用的,因为:

  • 它封装了用于桌面和OpenGL ES的OpenGL,确保我以“可移植”的方式使用OpenGL API。
  • 我不需要担心包含OpenGL头,Qt是为我做的。

然而,我怀疑是否有正确的方法来使用它。下面的行只列出了我所知道的使用这个类的三种方法。我的问题是:是否有一种使用QOpenGLFunctions的好方法?

QOpenGLFunctions继承的

Qt官方文档说:“从QOpenGLFunctions继承类,并像以前一样使用glXXXX类。

  • 如果我的类以前被期望从其他类继承,那么我必须进行多继承。我不是那种人。即使这样的案子是安全的,也是有价值的.
  • 每个glXXXX包装类都是非const的。我会强迫所有使用OpenGL的方法都是非连续的。那可不算什么道理。是的,当我执行OpenGLFunctions时,glClear(...)类可以合法地是非连续的,但是为什么我的方法DrawableShape::render(...)会是?

以及关于从QOpenGLFunctions继承。它的构造函数可以接受一个参数:当前的OpenGL上下文。这个参数对我来说很重要,但是没有Qt文档调用这个构造函数。相反,它们让编译器选择无参数构造函数。

QOpenGLFunctions 为成员的

另一个想法应该是让QOpenGLFunctions的一个实例作为调用glXXXXX函数的任何类的成员,或者至少有一个对一个实例的引用,并从这个实例调用每个OpenGL函数。

QOpenGLFunctions 作为参数传递给

对于使用OpenGL的每个函数,调用方发送QOpenGLFunctions。这条路:

代码语言:javascript
复制
void renderRectangle(QOpenGLFunctions& opengl) const;

但是,我怎么能确定这个函数会需要它,而这个功能不会呢?我的意思是源代码会随着时间的推移而变大,我担心看到每个类的方法都收到这个参数的风险.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-02 07:56:04

遵循其他面向对象包装器库的相同原则,您可能会考虑第三个选项的一个小变体。

定义一个表示当前opengl上下文的类,该类也扩展了QOpenGLFunctions

代码语言:javascript
复制
class GL : public QOpenGLFunctions{

  QGLContext& context;

  GL(QGLContext& c) : glContext(c){ ... }

};

呈现线程将初始化提供当前上下文的GL实例,并将其传递给所有需要执行opengl操作的呈现实例。通过这种方式,您还可以确定在初始化和使用opengl结构和缓冲区时不会混合多个上下文。

代码语言:javascript
复制
class Visualizer{

 void glInit(GL& gl){ ... } 

 void glPaintOpaque(GL& gl){ ... } 

 void glPaintTranslucent(GL& gl){ ... } 

};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24122800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档