qt调用opengl渲染图片并显示 头文件和源文件和注释
时间: 2024-02-21 22:58:33 浏览: 108
以下是一个简单的Qt程序,它使用OpenGL渲染图片并在窗口中显示。其中包括一个头文件、一个源文件和注释:
头文件:glwidget.h
```c++
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent = nullptr);
~GLWidget();
protected:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
private:
GLuint m_texture;
};
#endif // GLWIDGET_H
```
源文件:glwidget.cpp
```c++
#include "glwidget.h"
#include <QImage>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
GLWidget::GLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
GLWidget::~GLWidget()
{
makeCurrent();
glDeleteTextures(1, &m_texture);
doneCurrent();
}
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
// Load image
QImage image(":/image.jpg");
image = image.convertToFormat(QImage::Format_RGBA8888);
// Create texture
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Enable depth testing
glEnable(GL_DEPTH_TEST);
}
void GLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Set up projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width(), 0, height(), -1, 1);
// Set up model-view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Bind texture
glBindTexture(GL_TEXTURE_2D, m_texture);
// Draw textured quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(width(), 0);
glTexCoord2f(1, 1); glVertex2f(width(), height());
glTexCoord2f(0, 1); glVertex2f(0, height());
glEnd();
}
```
注释:
glwidget.h 文件中的类 GLWidget 继承了 QOpenGLWidget 和 QOpenGLFunctions。QOpenGLWidget 是一个方便的类,它封装了许多与 OpenGL 相关的操作,例如创建 OpenGL 上下文和处理窗口调整大小等。QOpenGLFunctions 是一个辅助类,它提供了许多 OpenGL 函数的声明,这些函数可以在 QOpenGLWidget 中使用。
在 GLWidget 类中,我们声明了一个私有成员变量 m_texture,它存储了我们加载的纹理图像的标识符。
GLWidget 的三个函数分别是 initializeGL、resizeGL 和 paintGL。initializeGL 函数在窗口第一次显示时被调用,我们在这个函数中加载纹理图像并创建纹理对象。resizeGL 函数在窗口大小变化时被调用,我们在这个函数中设置视口。paintGL 函数在窗口需要重新绘制时被调用,我们在这个函数中绘制纹理图像。
glwidget.cpp 文件中的代码实现了上述的三个函数。我们首先在 initializeGL 函数中加载纹理图像并创建纹理对象。我们使用 glGenTextures 函数生成一个纹理对象标识符,并使用 glBindTexture 函数将其绑定到 GL_TEXTURE_2D 目标上。然后,我们使用 glTexImage2D 函数将纹理图像数据上传到纹理对象中,并设置纹理过滤器以控制纹理的缩放行为。最后,我们启用深度测试以确保正确的绘制顺序。
在 resizeGL 函数中,我们使用 glViewport 函数设置视口。视口是 OpenGL 中的一个矩形区域,它定义了窗口中可见的区域。在这个例子中,我们将视口设置为整个窗口的大小。
在 paintGL 函数中,我们首先使用 glClear 函数清除颜色缓冲区和深度缓冲区。然后,我们设置投影矩阵和模型视图矩阵,这些矩阵用于确定绘制的几何形状在屏幕上的位置和大小。接下来,我们绑定纹理对象并绘制一个带有纹理的矩形。我们使用 glBegin 和 glEnd 函数来指定绘制的形状,使用 glTexCoord2f 和 glVertex2f 函数来指定每个顶点的纹理坐标和屏幕坐标。
阅读全文