QT與菜鳥的opengl貼圖

假期本該是無論做什麼都提不起勁來纔對 ゆ_ゆ
    可不知爲什麼越晚就越來精神。
    我們的階段性目標是爲了在QT的 GLWidget上顯示點雲,可就目前掌握的知識來看還缺乏相機的知識,只能繼續按照教程進行研究與創造。opengl貼圖!首先放效果:


        就像大家所知的那樣,QT封裝了opengl3.0方法,但是其接口變得快跟D3D一樣複雜了。

這個界面的風格用的是網上的,一搜就有,是一個老外弄的吧。但是人們很少在網上分享他們的qss風格,不知道爲何。

        QT5的opengl3雖然引入了頂點緩存和索引緩存,但是其寫法和傳統的opengl差別還是很大。對於像我這樣的菜鳥來講,能在傳統opengl下摸爬滾打就已經很吃力了,更沒有閒暇的功夫去沾手更高級的東西。

這幾次的博客其實寫得並不好,都是代碼,也沒有太多功夫放註釋上來。

以後等有時間了會精雕細琢。

        簡單說一下,QglWidget可以進行opengl的固定管線繪製。其顯示主要由三個方法完成:


然後我翻了一下QTopengl的官方例子,搞的賊花哨,不適合新手學習。
我們還是乖乖跟着這三個重載函數走。
廢話說太多了,我們直接上代碼,Cpp文件中這樣寫:

void qScarletOpenglInterface::Start()
{
    setWindowTitle(tr("opengl demo"));
    fullscreen=false;//不全屏
    if (fullscreen)
        showFullScreen();
    rTri = 0.0;
    rQuad = 0.0;

    xRot =yRot=zRot =0.0;
    setGeometry(0,0,640,480);
}
 
void qScarletOpenglInterface::initializeGL()
{
    //爲當前環境初始化Opengl函數
    initializeOpenGLFunctions();
    Start();

    glShadeModel(GL_SMOOTH);
    glClearColor( 0.618, 0.0, 0.1, 0.2 );//紅綠藍
    glClearDepth(1.0);//設置深度緩存
    glEnable(GL_DEPTH_TEST);//啓用深度測試。
    glDepthFunc(GL_LEQUAL);//所作深度測試的類型。
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//真正精細的透視修正。這一行告訴OpenGL我們希望進行最好的透視修正。這會十分輕微的影響性能。
    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();
    gluLookAt(0, 0, 3, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);      //設置照相機位置
    //glTranslatef(ptsCen.x,ptsCen.y,ptsCen.z);
    glRotatef(thetaX, 1, 0, 0);
    glRotatef(thetaY, 0, 1, 0);
    glScalef(scaleFactor, scaleFactor, scaleFactor);
    glTranslatef(-px, -py, -pz);

    //Initial_DrawPoint();
}

void qScarletOpenglInterface::loadGLTextures()
{
    QImage tex, buf;
    if (!buf.load(":/logo/logo/Scarletogo3.png"))
    {
     qWarning( "Could not read image file, using single-color instead." );
        QImage dummy( 128, 128, QImage::Format_RGB32 );//Format_RGB32 Format_RGB888
        dummy.fill( Qt::green);
        buf = dummy;//如果載入不成功,自動生成一個128*128的32位色的綠色圖片。
    }
    tex = QGLWidget::convertToGLFormat( buf );
    glGenTextures( 1, &m_texture[0] );
    glBindTexture( GL_TEXTURE_2D, m_texture[0] );
    glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
          GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
      glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
}
void qScarletOpenglInterface:: paintGL_Texture()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glLoadIdentity();
    glTranslatef(  0.0,  0.0, -5.0 );
    glRotatef( xRot,  1.0,  0.0,  0.0 );
    glRotatef( yRot,  0.0,  1.0,  0.0 );
    glRotatef( zRot,  0.0,  0.0,  1.0 );
    glBindTexture( GL_TEXTURE_2D, m_texture[0] );//選擇我們使用的紋理。您不能在glBegin()和glEnd()之間綁定紋理
    glBegin( GL_QUADS );
    glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 );
    glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 );
    glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0,  1.0,  1.0 );
    glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0,  1.0,  1.0 );

    glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );
    glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0,  1.0, -1.0 );
    glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 );
    glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 );

    glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0,  1.0, -1.0 );
    glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0,  1.0,  1.0 );
    glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0,  1.0,  1.0 );
    glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 );

    glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 );
    glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0, -1.0, -1.0 );
    glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 );
    glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 );

    glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0, -1.0, -1.0 );
    glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0,  1.0, -1.0 );
    glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0,  1.0,  1.0 );
    glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0, -1.0,  1.0 );

    glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );
    glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0,  1.0 );
    glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0,  1.0,  1.0 );
    glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0,  1.0, -1.0 );
    glEnd();
    xRot += 0.3;
    yRot += 0.2;
    zRot += 0.4;
}
void qScarletOpenglInterface::paintGL()//不會自動調用paintGL的
{
 
    paintGL_Texture();//繪製紋理
    update();
} 

以上就完成了opengl的貼圖。需要注意的是在貼圖之前要載入自己的紋理才行
 
最後: 
昨晚剛剛搭建完基於模型-視圖的opencv方法組合器。今早就立刻翻身繼續opengl的研究。
也許正因爲生命有限,人類纔會如此珍惜時光吧。
可就算再怎麼珍惜時光,就算在有限的時間裏做了再多的事,就算再怎麼在這個世界上留下名號。
對於已經死去的自己來講也是毫無意義的。
如果被賜予了無限的時間,最先崩壞的恐怕是信仰吧。
死後的世界什麼的也就不攻自破,什麼地獄天堂也將不復存在。

如果精神世界得不到滿足,只能在無盡的虛空中徘徊與恐懼。
人們尋求與他人的聯繫,這無非是恐懼的產物而已,就像因害怕孤獨而渴求團結一樣。
人們希望自己的存在爲他人所知,不停地討好與諂媚,多麼可悲。
我沒有無限的生命,也不求他人憐憫,大夥最終都要歸於塵土。
如果非要留下什麼的話,如果可以讓後人記住我的程序倒也不錯

發佈了41 篇原創文章 · 獲贊 62 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章