我正试图将我的旧Qt/OpenGL游戏从Linux移植到Windows。我正在使用Qt Creator。它立即编译得很好,但在链接阶段出现了很多类似undefined reference to 'glUniform4fv@12'
的错误。
我试图链接更多的库-lopengl32 -lglaux -lGLU32 -lglut -lglew32
,但它给出了相同的结果。
Qt也默认使用-lQt5OpenGLd
。
我将QGLWIdget包括在内:
#define GL_GLEXT_PROTOTYPES
#include <QGLWidget>
我也尝试过使用GLEW,但它与Qt(或QOpenGL?)一致。
我怎样才能去掉那些未定义的引用?还有其他图书馆需要我链接吗?
提前谢谢。
Tomxey
Windows不提供OpenGL 1.1之后引入的任何OpenGL函数的原型必须在运行时解析指向这些函数的指针(通过GetProcAddress
或更好的QOpenGLContext::getProcAddress
,请参阅下文)。
Qt提供了出色的推动者来简化这项工作:
-
QOpenGLShader
和QOpenGLShaderProgram
允许您管理着色器、着色器程序及其统一。QOpenGLShaderProgram提供了很好的重载,允许您无缝地传递QVector<N>D
或QMatrix<N>x<N>
类:QMatrix4x4 modelMatrix = model->transform(); QMatrix4x4 modelViewMatrix = camera->viewMatrix() * modelMatrix; QMatrix4x4 modelViewProjMatrix = camera->projMatrix() * modelViewMatrix; ... program->setUniform("mv", modelViewmatrix); program->setUniform("mvp", modelViewProjMatrix);
-
QOpenGLContext::getProcAddress()
是一个独立于平台的函数解析器(与QOpenGLContext::hasExtension()
结合使用可加载扩展特定函数) -
QOpenGLContext::functions()
返回一个QOpenGLFunctions对象(由上下文拥有),该对象作为公共API提供OpenGL2(+FBO)/ONGGLES2之间的公共子集functions->glUniform4f(...);
-
QOpenGLContext::versionFunctions<VERSION>()
将返回一个QAbstractOpenGLFunctions
子类,即与VERSION
模板参数匹配的子类(如果不能满足请求,则返回NULL):QOpenGLFunctions_3_3_Core *functions = 0; functions = context->versionFunctions<QOpenGLFunctions_3_3_Core>(); if (!functions) error(); // context doesn't support the requested version+profile functions->initializeOpenGLFunctions(context); functions->glSamplerParameterf(...); // OpenGL 3.3 API functions->glPatchParameteri(...); // COMPILE TIME ERROR, this is OpenGL 4.0 API
-
作为一种替代方式,您可以使您的"绘图"类/从
QOpenGLFunctionsX
继承/。你可以像往常一样初始化它们,但这样你就可以保持你的代码像:class DrawThings : public QObject, protected QOpenGLFunctions_2_1 { explicit DrawThings(QObject *parent = 0) { ... } bool initialize(QOpenGLContext *context) { return initializeOpenGLFunctions(context); } void draw() { Q_ASSERT(isInitialized()); // works, it's calling the one in the QOpenGLFunctions_2_1 scope... glUniform4f(...); } }
在QtOpenGL
模块中还有"匹配"类,即QGLContext
和QGLFunctions
。如果可能的话,避免在新代码中使用QtOpenGL
,因为它将在几个版本中被弃用,取而代之的是QOpenGL*
类。