如何定义 QT Opengl 帧缓冲区的大小
Posted
技术标签:
【中文标题】如何定义 QT Opengl 帧缓冲区的大小【英文标题】:How to define the size of QT Opengl framebuffer 【发布时间】:2021-07-20 04:30:00 【问题描述】:在 GLFW 中,我们通过此命令定义 Opengl 帧缓冲区的大小。
GLFWwindow* window = glfwCreateWindow(1920, 1080, "Test Window", NULL, NULL);
这会创建一个大小为 1920 X 1080 的 opengl 窗口,并且 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 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();
/////////////////////////////////////// ///////////////////////////////////////p>
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();
【问题讨论】:
默认的帧缓冲总是窗口大小。 @NicolBolas 在这种情况下,它将是被提升为 opegl 类的 Qwidget 的大小? 您实际上是如何创建底层上下文的?QOpenGLWidget
?
@G.M.我已经更新了代码。
我仍然不确定我是否理解这个问题,但是......底层帧缓冲区大小通常与QWidget
本身相同,并且会随着小部件的大小调整而相应调整。如果您希望小部件具有特定大小,请尝试调用QWidget::setFixedSize
。
【参考方案1】:
您可以使用QOpenGLFramebufferObject
指定大小
QOpenGLFramebufferObject 类封装了一个 OpenGL 帧缓冲区 对象
构造函数接受宽度和高度。还有其他重载的构造函数。 在此处查找文档。
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();
【讨论】:
以上是关于如何定义 QT Opengl 帧缓冲区的大小的主要内容,如果未能解决你的问题,请参考以下文章