我正在尝试将旧的Qt / OpenGL游戏从Linux移植到Windows。
我正在使用Qt Creator。
它立即编译好,但在链接阶段给出了很多错误,如undefined reference to 'glUniform4fv@12'
。
我试图链接更多的lib -lopengl32 -lglaux -lGLU32 -lglut -lglew32
,但它给出了相同的结果。
Qt默认使用-lQt5OpenGLd
。
我将QGLWIdget包括在内:
#define GL_GLEXT_PROTOTYPES
#include <QGLWidget>
我也尝试过使用GLEW,但它会与Qt(或QOpenGL?)混淆。
如何摆脱那些未定义的引用? 还有其他我需要链接的图书馆吗?
提前致谢。
Tomxey
答案 0 :(得分:4)
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对象(由上下文拥有),它提供OpenGL 2(+ FBO)/ OpenGL ES 2之间公共子集作为公共API.¹它将解决你背后的指针,所以你要做的就是调用
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*
类。