Qt实现opengl打开图片 头文件和源文件
时间: 2024-02-20 12:56:47 浏览: 120
以下是一个简单的实现OpenGL打开图片的例子,包括头文件和源文件:
头文件(glwidget.h):
```c++
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QGLWidget>
#include <QImage>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QWidget *parent = nullptr);
~GLWidget();
void openImage(const QString &fileName);
protected:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
private:
GLuint m_texture;
QImage m_image;
void loadTexture();
};
#endif // GLWIDGET_H
```
源文件(glwidget.cpp):
```c++
#include "glwidget.h"
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QOpenGLContext>
#include <QFile>
#include <QDebug>
GLWidget::GLWidget(QWidget *parent) :
QGLWidget(parent),
m_texture(0)
{
}
GLWidget::~GLWidget()
{
makeCurrent();
if (m_texture != 0) {
glDeleteTextures(1, &m_texture);
m_texture = 0;
}
doneCurrent();
}
void GLWidget::openImage(const QString &fileName)
{
m_image = QImage(fileName);
if (m_image.isNull()) {
qDebug() << "Failed to load image" << fileName;
} else {
loadTexture();
update();
}
}
void GLWidget::initializeGL()
{
// Set up the OpenGL context
QOpenGLContext *context = QOpenGLContext::currentContext();
Q_ASSERT(context);
context->setFormat(QGLFormat(QGL::SampleBuffers));
context->create();
context->makeCurrent(this);
// Set up the projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width(), height(), 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Enable textures
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Set up the texture
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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);
}
void GLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
}
void GLWidget::paintGL()
{
// Clear the window
glClear(GL_COLOR_BUFFER_BIT);
// Draw the texture
glBindTexture(GL_TEXTURE_2D, m_texture);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(0, 1); glVertex2f(0, height());
glTexCoord2f(1, 1); glVertex2f(width(), height());
glTexCoord2f(1, 0); glVertex2f(width(), 0);
glEnd();
}
void GLWidget::loadTexture()
{
if (m_texture == 0) {
glGenTextures(1, &m_texture);
}
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_image.width(), m_image.height(),
0, GL_BGRA, GL_UNSIGNED_BYTE, m_image.constBits());
}
```
这个例子使用了QGLWidget和OpenGL来显示一个图片。GLWidget类继承自QGLWidget,它重载了三个OpenGL函数:initializeGL()、resizeGL()和paintGL()。其中,initializeGL()用于初始化OpenGL上下文,resizeGL()用于响应窗口大小变化,paintGL()用于绘制场景。
openImage()函数用于打开一张图片,并更新OpenGL场景,使用了QImage来加载图片数据,然后调用loadTexture()函数将图片数据加载到OpenGL的纹理中。
在initializeGL()中,首先设置了OpenGL上下文的格式,然后将投影矩阵设置为正交投影,启用了纹理和混合,初始化了纹理,并设置了纹理的过滤和环绕方式。在loadTexture()中,将图片数据加载到纹理中。
注意,在使用OpenGL时,需要在OpenGL上下文中进行操作,因此需要使用QOpenGLContext::currentContext()获取当前的OpenGL上下文,并在需要使用OpenGL函数时调用makeCurrent()函数,将当前的OpenGL上下文设置为当前线程的上下文。在使用完OpenGL函数后,需要调用doneCurrent()函数,将当前OpenGL上下文设置为无效上下文。
阅读全文