您的位置:首页 > 编程语言 > Qt开发

NeHe教程Qt实现——lesson06

2012-03-05 23:12 316 查看
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
}


实际运行效果如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: