一.介绍
之前学习了怎样绘制物体,还画了个DX自带的茶壶,然而这个东东并不怎么好看....离我们现实的物体简直相隔千里。只能说像美术他们用来写生的模型...那么要怎么样才能让我们的东西看起来更像真实的物体呢?这个就要用到今天学习的纹理映射技术了...
纹理映射(Texture Mapping),又称纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。简单来说,就是把一幅图像贴到三维物体的表面上来增强真实感,可以和光照计算、图像混合等技术结合起来形成许多非常漂亮的效果。总之,纹理映射就是我们用一幅2D图片贴在3D物体上,让物体表面呈现为2D图片的样子,使物体看起来更加真实。
我们一般把纹理映射所使用的2D图像称作纹理贴图。Direct3D支持多种的纹理贴图,比如有.bmp、.dds、.dib、.png以及.tga等等,为了提高程序使用纹理的效率,通常使用边长为2的N次方幂的正方形图片。
介绍就这么多,开始动手。
二.过程
创建纹理贴图分为四个步骤:定点的定义,定点的访问,纹理的创建,纹理的启用
1.顶点的定义:
在使用定点缓存或者索引缓存绘图的时候,我们定义过定点,不过当时的定点是只包括了坐标和顶点的颜色,在这里,我们就不需要定义定点的颜色了,因为绘制物体的颜色会由纹理的颜色来确定。我们只需要在定义坐标的时候,再添加一个纹理坐标(u,v)即可。
struct stVertex
{
float _x, _y, _z; //位置坐标
float _u, _v; //纹理坐标
stVertex(float x, float y, float z, float u, float v) : _x(x), _y(y), _z(z), _u(u), _v(v){}
stVertex(){}
};
定义灵活顶点的格式:
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
这样,我们的顶点格式就定义好啦!
2.顶点的访问:
与顶点缓冲绘图一样,定义过定点之后,需要给定点赋值,这次我们赋值坐标之后,还要给纹理坐标赋值:例如:
vertex[0] = stVertex(-10.0f, 10.0f, -10.0f, 0.0f, 0.0f);
当然,其他的步骤与之前一样,也需要锁住缓冲区再操作,然后还要解锁。
3.纹理的创建:
这里就是我们的新内容啦,创建纹理一般使用这么一个函数:D3DXCreateTextureFromFile
有三个参数,第一个为D3D设备接口指针,第二个为纹理图片的路径名,第三个为纹理的指针。
例如:
D3DXCreateTextureFromFile(g_pDevice, TEXT("texture.png"), &g_pTexture);
创建好了纹理,我们就可以在绘制的时候使用啦,使用纹理很简单,在绘制物体之前,使用SetTexture函数即可:
函数有两个参数,第一个为纹理是哪一层,我们知道,一共可以创建8层纹理,所以这个参数的取值就为0-7啦。第二个就是我们的纹理指针啦。
g_pDevice->SetTexture(0, g_pTexture);
三.例子
下面是一个完整的例子: 我们通过索引缓存绘图,绘制一个立方体:
没有加纹理之前是介个样子滴:
然后我们使用一个砖墙的纹理图片,加上纹理之后效果棒棒哒: