我是OpenGL的新手,所以这可能是一个愚蠢的问题。似乎我错过了一些明显的东西。我看不出新的OpenGL类应该如何有用。
OpenGL的每个版本和配置文件都有类。这些类具有每个版本支持的所有 OpenGL 调用的显式方法。以下是部分列表:
- QOpenGLFunctions_1_0
- QOpenGLFunctions_1_1
- QOpenGLFunctions_1_2
- QOpenGLFunctions_1_3
- QOpenGLFunctions_1_4
我认为它会像下面这样:
- 查询视频卡并询问它支持哪个版本的 OpenGL。
- 实例化使用 QOpenGLContext::versionFunctions() 支持的最高版本的类的副本
那么如何使用这个类编写代码呢?我无法预测我将在运行时获得哪个对象,而不知道它将在什么硬件上运行。基类不包含任何方法,因为它们对于每个派生类都是不同的。我可以写一个巨大的开关,但这似乎是使用QOpenGLFunctions或手动获取函数地址的倒退。
这些类之所以有用,是因为之前的 QOpenGLFunctions 类只公开了 OpenGL/ES 2.0 功能。现在,他们已经公开了许多版本的OpenGL的全部功能,使您可以利用仅在这些版本中提供的功能。
当然,大多数开发人员不会在运行时为大多数应用程序选择 GL 版本。它们针对特定的版本,为此Qt类将很好地工作。
如果您正在寻找一种在不知道您使用的是哪个版本的 OpenGL 的情况下调用各种 QOpenGLFunctions_* 类之间的"通用"方法的方法(同时仍然让自己有机会利用"更高"版本的特定功能),为什么不使用模板呢?
例如:
template <class T>
class SomeOpenGLRendering {
public:
SomeOpenGLRendering(T *openglFunctions) : openglFunctions(openglFunctions) {
openglFunctions->initializeOpenGLFunctions();
}
void renderSomething() {
openglFunctions->glClear(GL_COLOR_BUFFER_BIT);
}
private:
T *openglFunctions;
};
然后根据您想要的任何标准(例如,您所说的硬件检测),根据需要创建正确的版本:
SomeOpenGLRendering<QOpenGLFunctions_3_2_Core> r(new QOpenGLFunctions_3_2_Core());
r.renderSomething();