C++ QOPENGLFUNCES的正确用法
我目前正在使用Qt5 gui模块访问OpenGL函数。 然后我发现C++ QOPENGLFUNCES的正确用法,c++,opengl,qt5,C++,Opengl,Qt5,我目前正在使用Qt5 gui模块访问OpenGL函数。 然后我发现QOpenGLFunctions非常有用,因为: 它包装了OpenGL for Desktop和OpenGL ES,确保我以“可移植”的方式使用OpenGL API 我不必担心包含OpenGL标题,Qt为我做的 然而,我对使用它的正确方法存有疑问。 下面几行只列出了我知道的使用这个类的三种方法。 我的问题是:有没有一种好的方法来使用QOpenGLFunctions 继承自QOpenGLFunctions Qt官方文档说“从QO
QOpenGLFunctions
非常有用,因为:
- 它包装了OpenGL for Desktop和OpenGL ES,确保我以“可移植”的方式使用OpenGL API
- 我不必担心包含OpenGL标题,Qt为我做的
QOpenGLFunctions
继承自QOpenGLFunctions
Qt官方文档说“从QOpenGLFunctions
继承类,并像以前一样使用glXXXX类。但我不喜欢这种方式,因为:
- 如果我的类以前需要从其他类继承,那么我必须进行多重继承。我不是那种人。即使这样的病例是安全的,这也是美学的
- 每个glXXXX包装类都是非常量的。我会强制所有使用OpenGL的方法都是非常量的。这没有太多意义。是的,当我执行
时,glClear(…)
类可以合法地是非常量的,但是为什么我的方法OpenGLFunctions
会是非常量呢DrawableShape::render(…)
QOpenGLFunctions
中继承。它的构造函数可以接受一个参数:当前OpenGL上下文。这个参数对我来说似乎非常重要,但是没有Qt文档调用这个构造函数。相反,它们让编译器选择无参数构造函数
拥有QOPENGLFUNCTION
成员身份
另一个想法是让QOpenGLFunctions
的实例作为调用glXXXXX函数的任何类的成员,或者至少引用一个实例,并从该实例调用每个OpenGL函数
将QOPENGLFUNCES
作为参数传递
对于使用OpenGL的每个函数,调用者发送QOpenGLFunctions
。这样:
void renderRectangle(QOpenGLFunctions& opengl) const;
但是我怎么能确定这个函数需要它而这个函数不需要呢?我的意思是,源代码将越来越大,我担心看到每一个类接收该参数的方法的风险…< P>根据其他面向对象包装库的相同原理,您可以考虑第三个选项的小变化。 定义一个表示当前opengl上下文的类,该类还扩展了QOPENGLFunction
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){ ... }
};
最近有几个类似的问题。我会让其他人来决定这是否足够接近成为一个复制品。但是前面的答案在任何情况下都会有帮助。问题1:。问题2:事实上,是的,我看到了这两个问题。但即使这两个答案都很有价值,我也不能说它们在“这方面有好的实践吗?”,它们只回答了一个关于在
QOpenGLFunction
构造函数中包含上下文的问题:)。这在某些平台(Windows/WGL)上很重要,而在其他平台(Linux/GLX)上则不太重要。这一切都与如何在每个特定平台上加载函数指针有关。在Windows上,两个上下文可能属于完全不同的GL实现,因此如果使用多个上下文,则应始终确保函数指针相对于特定上下文。GLX是不同的,事实上,你可以在GLX中加载函数指针,甚至没有上下文-它们在你有上下文之前不会做任何事情。很高兴知道,谢谢!是的,这是个好主意。实际上,glXXX函数并不是全部包装在QOpenGLFunctions
中,这迫使我同时使用gl.doSomething()
和glDoSomethingElse()
,但这并不是一个真正的问题。谢谢你的邀请。