Qt基于opengl渲染QImage 头文件以及源文件
时间: 2023-11-08 15:05:38 浏览: 40
下面是一个基于OpenGL渲染QImage的简单示例,包括头文件和源文件:
头文件 MyOpenGLWidget.h:
```
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QImage>
class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
MyOpenGLWidget(QWidget *parent = nullptr);
void setImage(const QImage &image);
protected:
void initializeGL() override;
void paintGL() override;
private:
GLuint m_textureID;
QImage m_image;
};
#endif // MYOPENGLWIDGET_H
```
源文件 MyOpenGLWidget.cpp:
```
#include "MyOpenGLWidget.h"
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
setFormat(QSurfaceFormat::defaultFormat());
}
void MyOpenGLWidget::initializeGL()
{
initializeOpenGLFunctions();
QOpenGLTexture *texture = new QOpenGLTexture(m_image.mirrored());
m_textureID = texture->textureId();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glDisable(GL_TEXTURE_2D);
}
void MyOpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_textureID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}
void MyOpenGLWidget::setImage(const QImage &image)
{
m_image = image;
update();
}
```
在这个示例中,MyOpenGLWidget类继承自QOpenGLWidget,同时也继承了QOpenGLFunctions。在构造函数中,我们启用了OpenGL。在initializeGL()函数中,我们创建了一个QOpenGLTexture对象,并将它的ID存储在m_textureID中。我们还设置了一些纹理参数。在paintGL()函数中,我们绑定了纹理,并绘制了一个矩形。最后,我们使用setImage()函数将QImage传递给MyOpenGLWidget对象,并使用update()函数刷新窗口。