如何定义QT Opengl framebuffer的大小

How to define the size of QT Opengl framebuffer

在GLFW中我们通过这个命令来定义Opengl framebuffer的大小

 GLFWwindow* window = glfwCreateWindow(1920, 1080, "Test Window", NULL, NULL);

这将创建一个大小为 1920 X 1080 的 opengl window,并且 Opengl 的默认帧缓冲区也是相同大小。

我们如何在 QT 中做同样的事情

这就是我目前为 opengl 渲染设置参数的方式。

QGLFormat  format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setSampleBuffers(true);
format.setSamples(4);
format.setSwapInterval(1);

QGLFormat::setDefaultFormat(format);

////////////////////////////////// GlWidget Class / //////////////

class GLWidget : public  QOpenGLWidget
{
    Q_OBJECT;
public:
    explicit GLWidget(QWidget *parent = 0);
//  ~GLWidget();
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int w, int h) override;
    QTimer timer;
    QElapsedTimer elapsedtimer;
    

private:
    int width;
    int height;

};

///////////////////////////////////////////////////////////////////////////////////
GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent)
{
    
}

//////////////////////////////////////////////////////////////////////////////////////////
void GLWidget::initializeGL() 
{
    GLenum GlewInitResult;
    glewExperimental = GL_TRUE;
    GlewInitResult = glewInit();
    if (GLEW_OK != GlewInitResult)   // Check if glew is initialized properly
    {
        QMessageBox msgBox;
        msgBox.setText("Not able to Initialize Glew");
        msgBox.exec();
    }

}

/////////////////////////////////////////// ////////////////////////////////////////////////////

void GLWidget::paintGL() 
{
  // Painting commands here which are opengl commands using GLEW.
     glBindFramebuffer(GL_FRAMEBUFFER, 0);  // Render in default framebuffer
     glClear(GL_COLOR_BUFFER_BIT);
     RenderCube();  

   
}
///////////////////////////////////////////////////////////////////////////////////////////

IN the Main function

QApplication application(argc, argv);

QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setVersion(3, 2);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);

return application.exec();

您可以使用 QOpenGLFramebufferObject

指定大小

The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer object

构造函数接受宽度和高度。还有其他重载的构造函数。 在此处查找文档。

https://doc.qt.io/qt-5/qopenglframebufferobject.html#QOpenGLFramebufferObject-5

调用 bool QOpenGLFramebufferObject::bind() 以从系统提供的默认帧缓冲区切换。调用 bool QOpenGLFramebufferObject::release() 返回默认帧缓冲区。

示例:

QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
QOpenGLFramebufferObject* frameBufferObject = new QOpenGLFramebufferObject(1920, 1080, format);
frameBufferObject->bind();