【发布时间】:2015-04-30 18:21:32
【问题描述】:
目前正在尝试将 SDL2 / GLEW OpenGL 3.3 程序移植到 Qt 以使用 GUI 工具,但是由于我实际上需要使用窗口空间,所以我不能只从 QOpenGLWindow 继承。我必须初始化一个新的小部件,然后使用 QVBoxLayout 小部件将其添加到窗口中:
//in oglWidget.hpp file
class OGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_2_Core
{
Q_OBJECT
private:
bool m_core;
bool mTest;
public slots:
void cleanup();
public:
OGLWidget(QWidget *parent = 0);
~OGLWidget();
QSize minimumSizeHint() const Q_DECL_OVERRIDE;
QSize sizeHint() const Q_DECL_OVERRIDE;
void initializeGL() Q_DECL_OVERRIDE;
void paintGL() Q_DECL_OVERRIDE;
void resizeGL(int width, int height) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
};
//inside mainWindow.cpp
...
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setVersion(3, 2);
format.setProfile(QSurfaceFormat::CoreProfile);
glRenderer = new OGLWidget();
glRenderer->setFormat(format);
ui->openglLayout->addWidget(glRenderer);
...
//in oglWidget.cpp
void OGLWidget::initializeGL()
{
//from parent class
this->initializeOpenGLFunctions();
//deals with unexpected closeings due to foreign widgets etc
connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &OGLWidget::cleanup);
QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
qDebug() << "Driver Version String:" << versionString;
qDebug() << "Current Context:" << this->format();
}
这让我可以按原样使用 OpenGL API,只需在需要时调用它。问题是我似乎无法在文件之间共享它,例如纯静态的资源管理器类,甚至不是静态的着色器管理器类。我只能从这个 odlWidget.cpp 文件访问 OpenGL。我似乎不知道如何授予对其他文件的访问权限,因为 GLEW 只需要包含在需要访问权限的任何地方。
以下会产生 segFault:
//in shadermanager.hpp
class ShaderManager
{
private:
void checkForErrors(GLuint object, std::string type);
QOpenGLFunctions_3_2_Core *glFuncs;
public:
GLuint ID;
ShaderManager() {glFuncs->initializeOpenGLFunctions();}
}
Qt 需要什么才能共享 OpenGL API?上下文?我是否必须将当前的 QOpenGLFunctions_3_2_Core 对象传递给每次都必须访问 OpenGL 的对象?这方面的文档(包括示例)只是对所有 OpenGL 相关函数使用单个文件,而唯一不使用的文档(框示例)将注释包含添加到 GLEW。
解决这个问题的最佳方法是什么?
我正在运行 Xubuntu LTS 64 位,我可以确认驱动程序和库已正确安装,因为 SDL2 / GLEW 版本可以正常编译和运行。
【问题讨论】:
-
确保你的
ShaderManager是在你有一个OpenGL上下文之后创建的(不知道QT,所以我猜是initializeGL之后)。此外,如果您在initializeGL中重新加载 GL 函数,则在ShaderMAnager中重新加载是多余的。 -
它是,仍然不会编译。编辑:我的错,它编译它只是段错误。
-
不会编译?你说它有段错误。编译器错误和源代码是什么?此外,您不会在构造函数中初始化
ShaderManager.glFuncs。
标签: c++ linux qt opengl opengl-es