我是OpenGL的新手,在解决以下错误方面让我有点瘫痪。
以下是重现问题的最小代码:
#include <GL/glew.h>
#include <QtWidgets/QApplication>
#include <QOpenGLWidget>
#include <QSurfaceFormat>
#include <GL/GLU.h>
#include <iostream>
using namespace std;
class OGLErrorTest : public QOpenGLWidget
{
public:
OGLErrorTest(QWidget *p = nullptr) : QOpenGLWidget(p)
{
QSurfaceFormat sformat;
sformat.setProfile(QSurfaceFormat::CompatibilityProfile);
sformat.setMajorVersion(2);
sformat.setMinorVersion(1);
sformat.setDepthBufferSize(0);
sformat.setAlphaBufferSize(0);
sformat.setRedBufferSize(8);
sformat.setGreenBufferSize(8);
sformat.setBlueBufferSize(8);
sformat.setStencilBufferSize(0);
sformat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
sformat.setStereo(false);
setFormat(sformat);
}
~OGLErrorTest() {}
protected:
void initializeGL()
{
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (err != GLEW_OK) {
cout << "Failed to initialize GLEW" << endl;
exit(-1);
}
const char *glv = (const char *)glGetString(GL_VERSION);
glv = glv ? glv : "(unable to get OpenGL version)";
cout << glv << endl;
}
void resizeGL(int w, int h) {}
void paintGL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 100, 0, 100);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINES);
glVertex2d(0, 0);
glVertex2d(100, 100);
glEnd();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const char *qt_version = qVersion();
qt_version = qt_version ? qt_version : "(unable to get qt version)";
cout << qt_version << endl;
OGLErrorTest w;
w.show();
return a.exec();
}
上述程序的控制台输出是:
5.6.0
2.1.0 - Build 8.15.10.2104
[opengl\qopenglframebufferobject.cpp line 538] OpenGL Error: 1286
QOpenGLFramebufferObject: Unsupported framebuffer format.
QOpenGLFramebufferObject: Unsupported framebuffer format.
[opengl\qopenglframebufferobject.cpp line 730] OpenGL Error: 1280
我的Qt版本是5.6.0,而OpenGL版本是2.1.0(我理解这是相当古老的)。我通过Visual Studio 2015在Windows 7上编译程序。如果您正在运行该程序,则必须与控制台子系统链接并在调试模式下编译它以使错误可见。
图像显示正确。没问题。
然而,我的问题是:我怎样才能摆脱两个OpenGL错误(1286,1280)?它看起来像Qt问题,还是看起来它可以通过(比如说)正确配置OpenGL上下文来消除?我认为Qt正在尝试使用我的硬件不支持的一些功能。如果是这种情况,我的问题是,我怎么能告诉Qt不要指望这些功能可用?
我尝试查看源代码(qopenglframebufferobject.cpp),但无法弄清楚可以采取哪些措施来修复错误。