QT与菜鸟的opengl贴图

来源:互联网 发布:北大青鸟软件开发 编辑:程序博客网 时间:2024/05/22 02:09
假期本该是无论做什么都提不起劲来才对 ゆ_ゆ
    可不知为什么越晚就越来精神。
    我们的阶段性目标是为了在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的研究。
也许正因为生命有限,人类才会如此珍惜时光吧。
可就算再怎么珍惜时光,就算在有限的时间里做了再多的事,就算再怎么在这个世界上留下名号。
对于已经死去的自己来讲也是毫无意义的。
如果被赐予了无限的时间,最先崩坏的恐怕是信仰吧。
死后的世界什么的也就不攻自破,什么地狱天堂也将不复存在。

如果精神世界得不到满足,只能在无尽的虚空中徘徊与恐惧。
人们寻求与他人的联系,这无非是恐惧的产物而已,就像因害怕孤独而渴求团结一样。
人们希望自己的存在为他人所知,不停地讨好与谄媚,多么可悲。
我没有无限的生命,也不求他人怜悯,大伙最终都要归于尘土。
如果非要留下什么的话,如果可以让后人记住我的程序倒也不错

原创粉丝点击