1. 程式人生 > >Qt openGL 使用QImage 生成二維紋理

Qt openGL 使用QImage 生成二維紋理

實驗室軟體專案中需要繪製三維有限元網格圖,需要使用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