Direct3D采样器声明--Direct3D Sampler States

设置纹理采样属性

HRESULT  SetSamplerState(      
                  DWORD   Sampler,   
//指定纹理采样属性的纹理层ID0~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

     默认值

     Sampler State                          Default Value

     采样器声明                               默认数值

     * ADDRESSU                           D3DTADDRESS_WRAP
     * ADDRESSV                           D3DTADDRESS_WRAP
     * ADDRESSW                          D3DTADDRESS_WRAP
     * BORDERCOLOR                  0x00000000
     * MAGFILTER                          D3DTEXF_POINT
     * MINFILTER                            D3DTEXF_POINT
     * MIPFILTER                            D3DTEXF_NONE
     * MIPMAPLODBIAS                  0.0f
     * MAXMIPLEVEL                      0
     * MAXANISOTROPY                1
     * SRGBTEXTURE                    0
     * ELEMENTINDEX                    0
     * DMAPOFFSET                      256
   

由于我们是将图像渲染到一个有限大小的像素网格中(网格的大小就是屏幕的分辨率),这种尺寸的限制将会导致一些问题。例如,将一个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:

例如,打开线形纹理过滤:

     device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
     device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
     device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 

纹理选址模式
  纹理采用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_ADDRESSV - as above but for the V co-ordinate.

       D3DSAMP_ADDRESSV - 如上所述,但针对V轴。

     * D3DSAMP_ADDRESSW - as above but for the W co-ordinate.

       D3DSAMP_ADDRESSW - 如上所述,但针对W轴。

     All the above default to D3DTADDRESS_WRAP.

     上述所有情况的默认值是D3DTADDRESS_WRAP。

过滤器

  当一个纹理渲染以大于原先的尺寸渲染到屏幕上去,我们说它被放大了。若以小于原先的尺寸渲染,我们说它被缩小了。

 D3DSAMP_MAGFILTER - 若纹理以大于原先的尺寸渲染,看上去将呈块状。通过设置一个过滤器可以改善这种效果。D3DTEXF_POINT选择最近的像素,D3DTEXF_LINEAR应用线性过滤(一种对像素周围2X2的纹理像素取平均值的方法),D3DTEXF_ANISOTROPIC则兼顾考虑图元渲染时的角度,D3DTEXF_PY-RAMIDALQUAD采样4次并使用一个遮罩过滤器,D3DTEXF_GAUSSIANQUAD同样采样4次但是使用一个高斯过滤器。

 D3DSAMP_MINFILTER - 若纹理以小于原先尺寸渲染,将产生收缩效应和其他一些令人讨厌的效果。我们可以应用上述的过滤器解决这个问题。

 D3DSAMP_MIPFILTER - 使用mip map既可以改善纹理视觉效果,又可以减少渲染数据的大小。当向显卡提供纹理时同样提供了该纹理的不同尺寸的一系列纹理。Direct3D在渲染时会选择最接近屏幕渲染尺寸的纹理。同样可以通过对最佳尺寸mip map纹理两边的mip map进行采样来进一步改善效果。该值定义这样一种过滤器--对于放大过滤器来说有同样的选择。

  注意: 并不是所有的显卡都支持所有的采样方法。所有显卡都支持点采样,当前大部分显卡支持线形采样。至于其他采样,你需要检查你的显卡是否支持。可以使用CheckDeviceFormat函数来查看是否支持某种纹理采样。

  例如,检查某个显卡是否支持硬件纹理采样:

    device->CheckDeviceFormat(D3DADPTER_DEFAULT, D3DDEVTYPE_HAL, adapterFormat, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, textureFormat);

 若函数调用成功,说明支持该纹理采样。检测什么样的采样方法受支持需要查询device caps(设备性能)--可使用GetDeviceCaps设备函数做到这一点。


posted @ 2011-10-19 10:39  小 楼 一 夜 听 春 雨  阅读(2859)  评论(0编辑  收藏  举报