HRESULT SetSamplerState(
DWORD Sampler, //指定纹理采样属性的纹理层ID(0~7)
D3DSAMPLERSTATETYPE Type, //纹理过滤类型
DWORD Value //设置纹理采样属性值
);
第二个参数D3DSAMPLERSTATETYPE Type取值:
D3DSAMP_MAGFILTER //处理放大过滤
D3DSAMP_MINFILTER //处理缩小过滤
D3DSAMP_MIPFILTER //多纹理过滤
D3DSAMP_MIPMAPLODBIAS //多级纹理级数偏移值,初始值为0
D3DSAMP_MAXMIPLEVEL //最大多纹理级别,初始值为0
D3DSAMP_MAXANISOTROPY //各向异性,初始为1
第三个参数Value取值:
D3DTEXF_NONE //不使用特殊的采样方式
D3DTEXF_POINT //最近点采样
D3DTEXF_LINEAR //线性纹理采样
D3DTEXF_ANISOTROPIC //各向异性纹理采样
Default Values
由于我们是将图像渲染到一个有限大小的像素网格中(网格的大小就是屏幕的分辨率),这种尺寸的限制将会导致一些问题。例如,将一个16X16的纹理渲染到一个靠近摄像机的物体时可能占用100X100个屏幕像素,因次需要拉伸这个纹理。这样的效果将会得到一个难看的块状纹理。为了解决这个问题我们可以采用过滤器技术,比如线性过滤。
HRESULT SetSamplerState(DWORD Sampler, D3DSAMPERSTATETYPE State, DWORD Value);
* Samper - the sampler stage index (you can have a number of stages).
采样器 - 采样器阶段索引(可以有多个阶段)。
* State - this is a flag representing one of states that you want to change.
声明 - 你想要改变的状态的标志。
* Value - each state can have a value. What goes here depends totally on the State value.
值 - 每种状态有一个值。该值取决于阶段的值。
e.g. to turn on bilinear filtering for texturing:
例如,打开线形纹理过滤:
纹理选址模式
纹理采用UV值映射到几何体上。UV值(0, 0)是纹理的左上角,(1, 1)是纹理的右下角。U值向右增长,V值向下增长。若数值大于1则表明对纹理进行重复或平铺。可由这些值来决定如何处理这些情况。
D3DSAMP_ADDRESSU - U轴选址模式。D3DTADDRESS_WRAP表明若数值大于1,将重复应用纹理。所以如果我们设置U值为10,意味着纹理将在U轴重复10次。D3DTADDRESS_MIRROR与wrap类似,但是每次平铺的是前面一个纹理的镜像。D3DTADDRESS_CLAMP将纹理坐标限制为0到1.数值大于1的地方,纹理颜色依然是数值为1处的颜色。查看DirectX帮助文档获取各种数值情况。
过滤器
D3DSAMP_MAGFILTER - 若纹理以大于原先的尺寸渲染,看上去将呈块状。通过设置一个过滤器可以改善这种效果。D3DTEXF_POINT选择最近的像素,D3DTEXF_LINEAR应用线性过滤(一种对像素周围2X2的纹理像素取平均值的方法),D3DTEXF_ANISOTROPIC则兼顾考虑图元渲染时的角度,D3DTEXF_PY-RAMIDALQUAD采样4次并使用一个遮罩过滤器,D3DTEXF_GAUSSIANQUAD同样采样4次但是使用一个高斯过滤器。
D3DSAMP_MIPFILTER - 使用mip map既可以改善纹理视觉效果,又可以减少渲染数据的大小。当向显卡提供纹理时同样提供了该纹理的不同尺寸的一系列纹理。Direct3D在渲染时会选择最接近屏幕渲染尺寸的纹理。同样可以通过对最佳尺寸mip map纹理两边的mip map进行采样来进一步改善效果。该值定义这样一种过滤器--对于放大过滤器来说有同样的选择。
若函数调用成功,说明支持该纹理采样。检测什么样的采样方法受支持需要查询device caps(设备性能)--可使用GetDeviceCaps设备函数做到这一点。