之前学习了纹理映射相关知识,但是仅仅是知道读取一个纹理贴图,然后在绘制之前设置一下纹理,但是并不知道纹理设置的一些具体细节,今天就来填坑啦!
一.四种纹理寻址方式
我们读取一个纹理图片,最好的情况是所需要的图片大小和图片本身的大小一致,但是事实往往不是这么美好。所以当纹理图片的大小和我们所绘制的模型大小不一致时,就需要通过不同的纹理寻址方式来解决这个问题。
通常,我们取的纹理坐标为(0.0f, 1.0f),这个纹理坐标刚好对应图片的大小。而现在,我们要把纹理坐标变大,即变成大于1的值,而大于1的部分就是下面我们要学习的纹理寻址方式管辖的范围啦。
四中纹理寻址方式分别为:
1)重复寻址模式(wrap texture address mode)
2)镜像纹理寻址模式(mirror texture address mode)
3)夹取寻址模式(clamp texture address mode)
4)边框颜色寻址模式(border color texture mode)
下面分别看一下四中寻址方式。
先来一张正常的纹理图片,我们绘制了一个正对摄像机的平面,平面共有四个点,设置为有一组纹理的灵活顶点格式:
然后我们修改一下之前玩过无数次的定点格式,把纹理坐标的最大值由1.0改为2.0:
//顶点数据
vertex[0] = stVertex(-250.0f, 0.0f, 0.0f, 0.0f, 2.0f);
vertex[1] = stVertex(-250.0f, 500.0f, 0.0f, 0.0f, 0.0f);
vertex[2] = stVertex( 250.0f, 0.0f, 0.0f, 2.0f, 2.0f);
vertex[3] = stVertex( 250.0f, 500.0f, 0.0f, 2.0f, 0.0f);
这样,一张图片就不能完整的覆盖住模型啦,我们的纹理寻址方式就要派上用场啦!
注意,寻址方式的设定在u,v两个方向是可以分别设定的!
关于设置,我们可以通过DX的一个API---SetSamplerState函数来设定。
第一个参数是纹理的层数,一共不是可以有8层纹理嘛,如果只用第一层的话,直接设置为0就好啦。
第二个参数为u,v方向,分别为D3DSAMP_ADDRESSU,或者D3DSAMP_ADDRESSV即可
第三个参数为纹理寻址方式,如下: