NeHe教程Qt实现——lesson06

NeHe 系列教程之六: 纹理映射

英文教程地址:lesson06


本课以第一课的代码为基础,演示了加载纹理的过程。


首先给出的是绘制几何对象和加载纹理坐标的代码

namespace {
    GLfloat     xrot = 0;             // X Rotation ( NEW )
    GLfloat     yrot = 0;             // Y Rotation ( NEW )
    GLfloat     zrot = 0;             // Z Rotation ( NEW )

    GLuint      texture[1];       // Storage For One Texture ( NEW )

    QVector<QVector3D> vertices;
    QVector<QVector2D> texCoords;

    void makeObject()
    {

        vertices<<QVector3D(-1.0f, -1.0f,  1.0f)<<QVector3D(1.0f, -1.0f,  1.0f)<<QVector3D(1.0f,  1.0f,  1.0f)<<QVector3D(-1.0f,  1.0f,  1.0f)
                <<QVector3D(-1.0f, -1.0f, -1.0f)<<QVector3D(-1.0f,  1.0f, -1.0f)<<QVector3D(1.0f,  1.0f, -1.0f)<<QVector3D(1.0f, -1.0f, -1.0f)
                <<QVector3D(-1.0f,  1.0f, -1.0f)<<QVector3D(-1.0f,  1.0f,  1.0f)<<QVector3D(1.0f,  1.0f,  1.0f)<<QVector3D(1.0f,  1.0f, -1.0f)
                <<QVector3D(-1.0f, -1.0f, -1.0f)<<QVector3D(1.0f, -1.0f, -1.0f)<<QVector3D(1.0f, -1.0f,  1.0f)<<QVector3D(-1.0f, -1.0f,  1.0f)
                <<QVector3D(1.0f, -1.0f, -1.0f)<<QVector3D(1.0f,  1.0f, -1.0f)<<QVector3D(1.0f,  1.0f,  1.0f)<<QVector3D(1.0f, -1.0f,  1.0f)
                <<QVector3D(-1.0f, -1.0f, -1.0f)<<QVector3D(-1.0f, -1.0f,  1.0f)<<QVector3D(-1.0f,  1.0f,  1.0f)<<QVector3D(-1.0f,  1.0f, -1.0f);

         texCoords<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)
                  <<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)
                  <<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)
                  <<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)
                  <<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f)<<QVector2D(0.0f, 0.0f)
                  <<QVector2D(0.0f, 0.0f)<<QVector2D(1.0f, 0.0f)<<QVector2D(1.0f, 1.0f)<<QVector2D(0.0f, 1.0f);

          glVertexPointer(3, GL_FLOAT, 0, vertices.constData());
          glTexCoordPointer(2, GL_FLOAT, 0, texCoords.constData());

    }

    void drawObject()
    {
          glEnableClientState(GL_VERTEX_ARRAY);
          glEnableClientState(GL_TEXTURE_COORD_ARRAY);
          glDrawArrays(GL_QUADS, 0, vertices.size());
          glDisableClientState(GL_VERTEX_ARRAY);
          glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    }
}

然后是加载纹理的代码,该方法在头文件中声明:

void MyGLWidget::loadTextures()
{
    texture[0] = bindTexture(QString(":/NeHe.bmp"),
                             GL_TEXTURE_2D,
                             GL_RGBA);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering
}

初始化代码:

void MyGLWidget::initializeGL()
{
    makeObject();
    loadTextures();
    glEnable(GL_TEXTURE_2D);    // Enable Texture Mapping ( NEW )

    glShadeModel(GL_SMOOTH);   // Enables Smooth Shading
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);  // Black Background
    glClearDepth(1.0f);             // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);        // Enables Depth Testing
    glDepthFunc(GL_LEQUAL);        // The Type Of Depth Test To Do
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
}

最后,是实际的绘制代码:

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear The Screen And The Depth Buffer
    glLoadIdentity();       // Reset The Current Modelview Matrix
    glTranslatef(0.0f,0.0f,-5.0f);       // Move Into The Screen 5 Units

    glRotatef(xrot,1.0f,0.0f,0.0f);     // Rotate On The X Axis
    glRotatef(yrot,0.0f,1.0f,0.0f);   // Rotate On The Y Axis
    glRotatef(zrot,0.0f,0.0f,1.0f);       // Rotate On The Z Axis

    glBindTexture(GL_TEXTURE_2D, texture[0]);       // Select Our Texture
    drawObject();

    xrot += 0.3f;                             // X Axis Rotation
    yrot += 0.2f;                             // Y Axis Rotation
    zrot += 0.4f;                             // Z Axis Rotation
}

实际运行效果如下所示:


NeHe OpenGL教程(中英文版附带VC++源码)中英文系列 Lesson 01-lesson 02 创建一个OpenGL窗口: 如何创建三角形和四边形 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53679 Lesson 03-lesson 04 添加颜色 旋转 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53682 Lesson 05-lesson 06 3D空间 纹理映射 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53706 Lesson 07-lesson 08 光照和键盘控制 混合 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53709 Lesson 09-lesson 10 3D空间中移动图像 加载3D世界,并在其中漫游 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53822 Lesson 11-lesson 12 飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射 雾 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53881 Lesson 17-lesson 18 2D 图像文字 二次几何体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54042 Lesson 19-lesson 20 粒子系统 蒙板 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54072 Lesson 21-lesson 22 线,反走样,计时,正投影和简单的声音 凹凸映射,多重纹理扩展 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54074 Lesson 23-lesson 24 球面映射 扩展,剪裁和TGA图像文件的加载 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54176 Lesson 25-lesson 26 变形和从文件中加载3D物体 剪裁平面,蒙板缓存和反射 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54177 Lesson 27-lesson 28 影子 贝塞尔曲面 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54180 Lesson 29-lesson 30 Blitter 函数 碰撞检测 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54186 Lesson 31-lesson 32 模型加载 拾取, Alpha混合, Alpha测试, 排序 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54209 Lesson 33-lesson 34 加载压缩和未压缩的TGA文件 从高度图生成地形 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54271 Lesson 35-lesson 36 在OpenGL中播放AVI 放射模糊和渲染到纹理 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54289 Lesson 37-lesson 38 卡通映射 从资源文件中载入图像 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54290 Lesson 39-lesson 40 物理模拟简介 绳子的模拟 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54706 Lesson 41-lesson 42 体积雾气 多重视口 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54707 Lesson 43-lesson 44 在OpenGL中使用FreeType库 3D 光晕 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54710 Lesson 45-lesson 46 顶点缓存 全屏反走样 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54729 Lesson 47-lesson 48 CG 顶点脚本 轨迹球实现的鼠标旋转 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54730
NeHe OpenGL教程(中英文版附带VC++源码)中英文系列 Lesson 01-lesson 02 创建一个OpenGL窗口: 如何创建三角形和四边形 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53679 Lesson 03-lesson 04 添加颜色 旋转 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53682 Lesson 05-lesson 06 3D空间 纹理映射 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53706 Lesson 07-lesson 08 光照和键盘控制 混合 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53709 Lesson 09-lesson 10 3D空间中移动图像 加载3D世界,并在其中漫游 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53822 Lesson 11-lesson 12 飘动的旗帜 显示列表 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53823 Lesson 13-lesson 14 图像字体 图形字体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53880 Lesson 15-lesson 16 图形字体的纹理映射 雾 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=53881 Lesson 17-lesson 18 2D 图像文字 二次几何体 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54042 Lesson 19-lesson 20 粒子系统 蒙板 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54072 Lesson 21-lesson 22 线,反走样,计时,正投影和简单的声音 凹凸映射,多重纹理扩展 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54074 Lesson 23-lesson 24 球面映射 扩展,剪裁和TGA图像文件的加载 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54176 Lesson 25-lesson 26 变形和从文件中加载3D物体 剪裁平面,蒙板缓存和反射 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54177 Lesson 27-lesson 28 影子 贝塞尔曲面 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54180 Lesson 29-lesson 30 Blitter 函数 碰撞检测 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54186 Lesson 31-lesson 32 模型加载 拾取, Alpha混合, Alpha测试, 排序 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54209 Lesson 33-lesson 34 加载压缩和未压缩的TGA文件 从高度图生成地形 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54271 Lesson 35-lesson 36 在OpenGL中播放AVI 放射模糊和渲染到纹理 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54289 Lesson 37-lesson 38 卡通映射 从资源文件中载入图像 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54290 Lesson 39-lesson 40 物理模拟简介 绳子的模拟 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54706 Lesson 41-lesson 42 体积雾气 多重视口 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54707 Lesson 43-lesson 44 在OpenGL中使用FreeType库 3D 光晕 http://ieee.org.cn/dispbbs.asp?boardID=61&ID=54710
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值