我正在努力在 QT4 中创建一个无头控制台应用程序,该应用程序执行一些 OpenGL 渲染,然后通过 websocket 将结果通过网络发送出去。我运行了所有的渲染和网络代码(假设我有一个 GUI),但是我在转换到无头应用程序时遇到了一些麻烦。是否可以在没有窗口的情况下创建 QGLContext?
在网上阅读的次数不多,但从我收集到的内容中,您可以创建一个 QGLPixelBuffer,它是一个有效的 QPaintDevice。它似乎创建了自己的私有 QGLContext 用于硬件加速绘图。我在这条路线上遇到的问题是我需要访问它的底层 QGLContext 以便我可以与另一个线程共享它(用于将 DMA 纹理快速传输出渲染场景的网络线程)。下面包括一个小型原型。有任何想法吗?
应用程序.h
/**
@file
@author Nikolaus Karpinsky
*/
#ifndef _APPLICATION_H_
#define _APPLICATION_H_
#include <QCoreApplication>
#include <QTimer>
#include "MainController.h"
#endif // _APPLICATION_H_
应用程序.cpp
#include "Application.h"
int main(int argc, char **argv)
{
// Setup our console application with an event loop
QCoreApplication app(argc, argv);
// Create and initialize our controller
MainController controller;
controller.Init();
QObject::connect(&controller, SIGNAL( Finished() ), &app, SLOT( quit() ), Qt::QueuedConnection);
// This will put start on top of the event loop
QTimer::singleShot(0, &controller, SLOT( Start() ));
// Finally start up the event loop
return app.exec();
}
主控制器.h
/**
@file
@author Nikolaus Karpinsky
*/
#ifndef _MAIN_CONTROLLER_H_
#define _MAIN_CONTROLLER_H_
#include <QObject>
#include <QGLWidget>
#include <QGLPixelBuffer>
#include <QGLFramebufferObject>
#include <memory>
using namespace std;
class MainController : public QObject
{
Q_OBJECT
private:
unqiue_ptr<QGLPixelBuffer> m_mainBuffer;
//unique_ptr<QGLContext> m_mainContext;
public:
MainController();
void Init(void);
public slots:
void Start(void);
void Close(void);
signals:
void Finished(void);
};
#endif // _MAIN_CONTROLLER_H_
主控制器.cpp
#include "MainController.h"
MainController::MainController() : QObject()
{ }
void MainController::Init(void)
{
m_mainBuffer = unique_ptr<QGLPixelBuffer>(new QGLPixelBuffer(800, 600));
bool has = buffer->hasOpenGLPbuffers();
bool current = buffer->makeCurrent();
bool valid = buffer->isValid();
// Now I need to get access to the context to share it with additional threads
// m_mainContext = unique_ptr<QGLContext>(new QGLContext(buffer.getContext()));
}
void MainController::Start(void)
{
}
void MainController::Close(void)
{
// This will tell the event loop that we are done and close the app
emit( Finished() );
}