Qt openGL 使用QImage 生成二维纹理

来源:互联网 发布:顾比均线的通达信源码 编辑:程序博客网 时间:2024/05/17 01:25

实验室软件项目中需要绘制三维有限元网格图,需要使用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=QGLWidget::convertToGLFormat(buf2);
tex3=QGLWidget::convertToGLFormat(buf3);

glGenTextures(3,&texture[0]);

glBindTexture(GL_TEXTURE_2D,texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D(GL_TEXTURE_2D,0,3,tex1.width(),tex1.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,tex1.bits());

glBindTexture(GL_TEXTURE_2D,texture[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D(GL_TEXTURE_2D,0,3,tex2.width(),tex2.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,tex2.bits());

glBindTexture(GL_TEXTURE_2D,texture[2]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexImage2D(GL_TEXTURE_2D,0,3,tex3.width(),tex3.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,tex3.bits());
}

3.绘制texture。方式和绘制图形类似。glTexcoord2f()绘制texture对应的是texture的坐标系,其左下角是(0,0),右上角是(1,1)。值得注意的是,绘制texture会使得原OpenGL系统中的颜色混乱。对应方式是在绘制开始和结束处添加glEnable(GL_TEXTURE_2D)和glDisable(GL_TEXTURE_2D)语句。
glEnable(GL_TEXTURE_2D);
glColor3f(1.0,1.0,1.0);
glBindTexture( GL_TEXTURE_2D, texture[0] );

glBegin( GL_QUADS );glNormal3f(0.0,0.0,1.0);glTexCoord2f( 0.0, 0.0 );glVertex3f( 0.11,0.05,0 );glTexCoord2f( 1.0, 0.0 );glVertex3f( 0.15,0.05,0 );glTexCoord2f( 1.0, 1.0 );glVertex3f( 0.15,0.01,0 );glTexCoord2f( 0.0, 1.0 );glVertex3f( 0.11,0.01,0 );glEnd();glDisable(GL_TEXTURE_2D);

结束语
1.对于透明的图片,透明部分会成黑色(我的是这样的),可以对绘制texture部分进行改进,来绘制透明图片。
2.此方法是我参考网上的资料得到,具体OpenGL机制不求甚解。

效果图1

效果图2

原创粉丝点击