NeHe教程Qt实现——lesson06
2012-03-05 23:12
316 查看
NeHe 系列教程之六: 纹理映射
英文教程地址:lesson06
本课以第一课的代码为基础,演示了加载纹理的过程。
首先给出的是绘制几何对象和加载纹理坐标的代码
然后是加载纹理的代码,该方法在头文件中声明:
初始化代码:
最后,是实际的绘制代码:
实际运行效果如下所示:
英文教程地址: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 }
实际运行效果如下所示:
![](http://hi.csdn.net/attachment/201203/5/0_13309605159X9c.gif)
相关文章推荐
- NeHe教程Qt实现——lesson03
- NeHe教程Qt实现——lesson08
- NeHe教程Qt实现——lesson10
- NeHe教程Qt实现——lesson11
- NeHe教程Qt实现——lesson13
- NeHe教程Qt实现——lesson01
- NeHe教程Qt实现——lesson12
- NeHe教程Qt实现——lesson10
- NeHe教程Qt实现——lesson15
- NeHe教程Qt实现——lesson02
- NeHe教程Qt实现——lesson13
- NeHe教程Qt实现——lesson03
- NeHe教程Qt实现——lesson08
- NeHe教程Qt实现——lesson16
- NeHe教程Qt实现——lesson07
- NeHe教程Qt实现——lesson02
- NeHe教程Qt实现——lesson17
- NeHe教程Qt实现——lesson15
- NeHe教程Qt实现——lesson12
- NeHe教程Qt实现——lesson11