日期:2012-02-29  浏览次数:20466 次


讲了很多,最基础的部分就剩下纹理没有讲到了。Texture是Directx里面非常重要的一部分。为了简便起见,我们还是以SDK的Tutorial5为例子。



纹理就像一张墙纸,用来贴在物体的表面,当然,如果足够大,贴一次就能覆盖整个物体的表面,也可以用适当的方法让纹理排列成你要的效果。



来看看纹理的比较重要的函数:Device.SetTexture

public void SetTexture(
    int stage, //纹理混合阶段序号,从0开始
    BaseTexture texture //要设置的纹理对象
);




 


public void SetTextureStageState(
    int stage, //纹理混合阶段序号
    TextureStageStates state, // TextureStageStates enumeration的成员
    int value //对应阶段状态的值
);



SetTextureStageState函数对处理不同的纹理坐标,颜色操作,Alpha操作,和凹凸映射/环境映射比较适用,但是这些操作只对DX9的固定功能的多纹理单元有效,不能将他们与像素shader连用。



public void SetSamplerState(
    int stage, //纹理混合阶段序号
    SamplerStageStates state, // SamplerStageStates enumeration的成员
  int value  //对应采样器状态的值
);

知道了这些下面读懂这些代码就很容易了,我们需要建立Vertex,这里我们需要有一点点地改变,在以前我们接触到的Vertex里面都不涉及到纹理,所以我们选择了CustomVertex里面不包括纹理的类型,现在我们要用CustomVertex.PositionNormalTextured,从名字就可以看出来,这个类型包括了法线还包括了位置的X,Y,Z,以及纹理坐标的Tu和Tv。

当然如果使用CustomVertex.PositionTextured 也是可以的,它不包括法线信息。

接下来我们需要为每个Vertex指定信息,我们先打断一下讲讲纹理坐标,为了通过指定纹理坐标来访问纹理中的每个图素,DX采用了一个一般化的编址方案,纹理地址由[0.0,1.0]区间内的坐标组成,这样我们就不用关心纹理的实际尺寸,例如可以使用(0.0f,0.0f) ,(1.0f,0.0f),(1.0f,1.0f),(0.0f,1.0f)把一个纹理贴到一个矩形上,同样如果(0.0f,0.0f) ,(0。5f,0.0f),(0.5,1.0f),(0.0f,1.0f)就是纹理的左半边。

我们可以通过TextureLoader.FromFile方法来读入图片作为纹理。



这里代码很简单里面有详细的注释,我就不多讲了,



//-----------------------------------------------------------------------------



// File: texture.cs



//



// Desc: Better than just lights and materials, 3D objects look much more



//       convincing when texture-mapped. Textures can be thought of as a sort



//       of wallpaper, that is shrinkwrapped to fit a texture. Textures are



//       typically loaded from image files, and D3DX provides a utility to



//       function to do this for us. Like a vertex buffer, textures have



//       Lock() and Unlock() functions to access (read or write) the image



//       data. Textures have a width, height, miplevel, and pixel format. The



//       miplevel is for "mipmapped" textures, an advanced performance-



//       enhancing feature which uses lower resolutions of the texture for



//       objects in the distance where detail is less noticeable. The pixel



//       format determines how the colors are stored in a texel. The most



//       common formats are the 16-bit R5G6B5 format (5 bits of red, 6-bits of



//       green and 5 bits of blue) and the 32-bit A8R8G8B8 format (8 bits each



//       of alpha, red, green, and blue).



//



//       Textures are associated with geometry through texture coordinates.



//       Each vertex has one or more sets of texture coordinates, which are



//       named tu and tv and range from 0.0 to 1.0. Texture coordinates can be



//       supplied by the geometry, or can be automatically generated using
<