Qt openGL 使用QImage 生成二维纹理

在Qt OpenGL项目中,为了绘制三维有限元网格图的坐标轴X Y Z字符,作者遇到平面字符无法旋转的问题。通过将字符图片转化为QImage对象并生成纹理,实现了在OpenGL中贴图显示字符。文章详细介绍了如何加载纹理、创建纹理对象以及绘制纹理的方法,以解决坐标轴字符的3D显示需求。
摘要由CSDN通过智能技术生成

实验室软件项目中需要绘制三维有限元网格图,需要使用openGL,使用OpenGL可以很方便的绘制三维模型,但在绘制坐标系轴的X Y Z字符时,我遇到了一些问题。

首先我想到了使用 Qt openGL 中自带的函数renderText():
glColor3f(1,0,0);
renderText(0,0,0,QString(“hello”));
但是这样产生的character都是“平面的”,不能随着空间坐标系进行旋转。不适合绘制坐标系轴的X Y Z字符。

于是通过网上查阅相关的资料,发现了另一中方法。就是将字符的图片导入Qt的QImage类的一个对象中,当然也可以通过QPaint直接绘制到一QImage对象中。然后在OpenGL中将QImage的对象转化为一texture,通过OpenGL中贴纹理的方式,将包含该字符的图片显示在OpenGL中。

1.在OpenGL的头文件中建立一整型的数组来存储texture。(具体怎样的机制不清楚)。这里数组长度为3,表示X Y Z 三个texture。GLuint 表示openGL 中的整型。
GLuint texture[3];

2.载入texture。 这里建立一函数来载入texture。 (OpenGL中相关的具体函数不清楚机制)。
void opengl::loadGLTextures()
{
QImage tex1,tex2,tex3,buf1,buf2,buf3;
buf1.load(“:/opengl_axis/resource/X.jpg”);
buf2.load(“:/opengl_axis/resource/Y.jpg”);
buf3.load(“:/opengl_axis/resource/Z.jpg”);

tex1=QGLWidget::convertToGLFormat(buf1);
tex2=QG

要在Qt使用OpenGL来显示QImage,您需要使用QOpenGLWidget类。这是一个Qt小部件,它为OpenGL提供了一个渲染上下文,可以在其中绘制图形。下面是一个简单的示例代码,展示了如何使用QOpenGLWidget类显示QImage: ```cpp #include <QtWidgets/QApplication> #include <QtWidgets/QOpenGLWidget> #include <QtGui/QOpenGLShaderProgram> #include <QtGui/QOpenGLFunctions> #include <QtGui/QImage> #include <QtGui/QPainter> class SimpleOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { public: SimpleOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Load image QImage image("path/to/image.png"); // Convert image to OpenGL texture GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, 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); // Draw texture QOpenGLShaderProgram program; program.addShaderFromSourceCode(QOpenGLShader::Vertex, "attribute vec2 position; varying vec2 texCoord; void main() { gl_Position = vec4(position, 0.0, 1.0); texCoord = position * 0.5 + 0.5; }"); program.addShaderFromSourceCode(QOpenGLShader::Fragment, "uniform sampler2D texture; varying vec2 texCoord; void main() { gl_FragColor = texture2D(texture, texCoord); }"); program.link(); program.bind(); program.setUniformValue("texture", 0); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(0); // Delete texture glDeleteTextures(1, &texture); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); SimpleOpenGLWidget w; w.show(); return a.exec(); } ``` 在上面的代码中,我们首先在initializeGL()函数中初始化OpenGL,并在resizeGL()函数中设置视口。在paintGL()函数中,我们首先将QImage转换为OpenGL纹理,然后使用着色器程序绘制纹理。 请注意,这只是一个简单的示例代码,实际的应用程序可能需要更复杂的着色器程序和纹理绑定代码,以适应不同的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值