gpt4 book ai didi

c++ - QOpenGLFunctions 的正确用法

转载 作者:可可西里 更新时间:2023-11-01 16:22:37 25 4
gpt4 key购买 nike

我目前致力于使用 Qt5 gui 模块来访问 OpenGL 功能。然后我发现 QOpenGLFunctions 很有用,因为:

  • 它包装了 OpenGL for Desktop 和 OpenGL ES,确保我以“可移植”的方式使用 OpenGL API。
  • 我不必担心包含 OpenGL header ,Qt 会帮我做。

但我对正确使用它的方法存疑。以下几行仅列出了我所知道的使用此类的三种方式。我的问题是:是否有使用 QOpenGLFunctions 的好方法?

继承自 QOpenGLFunctions

Qt 官方文档说“从 QOpenGLFunctions 继承你的类并像以前一样使用 glXXXX 类。但我不喜欢这种方式:

  • 如果我的类之前需要从其他类继承,我必须进行多重继承。我不是那种人。即使这样的情况无论如何都是安全的,这也是美学......
  • 每个 glXXXX 包装类都是非常量。我会强制使用 OpenGL 的所有方法都是非常量的。这没有多大意义。是的,当我执行 glClear(...) 时,OpenGLFunctions 类可以合法地成为非常量,但为什么我的方法 DrawableShape::render(...) 会是?

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

QOpenGLFunctions 作为成员

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

QOpenGLFunctions 作为参数传递

对于每个使用 OpenGL 的函数,调用者发送 QOpenGLFunctions。这样:

void renderRectangle(QOpenGLFunctions& opengl) const;

但是我怎么能确定这个函数需要它而这个函数不需要呢?我的意思是源代码到时候会变得越来越大,我担心看到类的每个方法接收这个参数的风险...

最佳答案

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

定义一个代表您当前 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){ ... }

};

关于c++ - QOpenGLFunctions 的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com