Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QOPENGLFUNCES的正确用法_C++_Opengl_Qt5 - Fatal编程技术网

C++ QOPENGLFUNCES的正确用法

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

我目前正在使用Qt5 gui模块访问OpenGL函数。 然后我发现
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()
,但这并不是一个真正的问题。谢谢你的邀请。