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的研究。
也许正因为生命有限,人类才会如此珍惜时光吧。
可就算再怎么珍惜时光,就算在有限的时间里做了再多的事,就算再怎么在这个世界上留下名号。
对于已经死去的自己来讲也是毫无意义的。
如果被赐予了无限的时间,最先崩坏的恐怕是信仰吧。
死后的世界什么的也就不攻自破,什么地狱天堂也将不复存在。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值