纹理

来源:互联网 发布:决战武林奇兵进阶数据 编辑:程序博客网 时间:2024/04/29 03:18

什么是纹理?纹理就是我们通常说的贴图(又叫蒙皮)。其原理就是在3D的模型上面覆盖上2D的图片,让我们的3D模型显得更真实。看下面的两张图片,左边的是没有贴图的老虎模型,右边是贴了图的,很明显,贴了图的看上去更真实一些。

  

  令人高兴的是,D3D已经为我们提供了很方便的纹理功能,不过在实际动手之前,我们先来了解几个关于纹理的重要概念。

一、纹理尺寸
  纹理都是2D的图片,它可以保存为bmp、tga、jpg或是任何一种常见的图片格式,所以它肯定有大小。虽然理论上现在的新型显卡可以支持任意尺寸的纹理,不过为了兼容以前的显卡也为了程序的执行效率,你最好把纹理的尺寸做成2的n次方。如:16 x 16, 32 x 32, 64 x 64, 128 x 128, 256 x 256等等。

二、纹理坐标
  纹理坐标又叫贴图坐标,在D3D中用两个0到1的浮点值(U,V)来设置一个点的纹理坐标,U是横轴、V是纵轴。纹理的左上角为(0,0),右下角为(1,1)。下面这张图很清楚的说明了纹理坐标的定义。 

   

  如果一个3D模型有贴图,那么就要为模型上的每个点指定一对纹理坐标(U,V),作用是标明该点在贴图中的位置。

  好,下面就来说具体的贴图过程。
  (1) 首先,我们要把顶点的格式和FVF设置成下面的样子。

  // 自定义顶点结构
  struct CUSTOMVERTEX
  {
    D3DXVECTOR3 position; // 顶点坐标
    D3DCOLOR color; // 顶点颜色
    FLOAT tu, tv; // 贴图坐标
  };

  // 我们自定义的FVF,定义了顶点的结构,
  // D3DFVF_XYZ : 表示顶点坐标
  // D3DFVF_DIFFUSE : 表示顶点的颜色
  // D3DFVF_TEX1 : 表示有纹理
  #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)

  (2) 接着是定义和创建纹理,纹理在D3D中使用IDirect3DTexture8接口定义:

  LPDIRECT3DTEXTURE8 g_pTexture = NULL; // 纹理

  // 从一个文件创建我们的纹理
  D3DXCreateTextureFromFile( g_pd3dDevice, "3dgame.bmp", &g_pTexture ) );

  (3) 最后在渲染模型之前设置我们刚创建好的纹理就可以了:

  // 指定纹理
  g_pd3dDevice->SetTexture( 0, g_pTexture );
  g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );

  说明一下这次的例子,这次的例子是基于上一回例子的,我们在上一回生成的圆桶上贴上一张纹理,就是下面的这张。

  

  运行程序,执行的结果立刻出来了,如下:

   

  大致上纹理就是这样的,基本的原理了解后,一定要下来仔细阅读我们的例子程序,因为很多细节的东西都包含在程序中了,慢慢理解吧。

原创粉丝点击