Direct3D9学习手记(6)纹理过滤器

Direct3D9学习手记(6)纹理过滤器

又有偷懒的机会了,赶快在写一篇关于帖图中关于纹理过滤的..
我现在只知道用线性过滤会使帖图看起来更平滑,其他还没领悟到..

可参考:

http://www.gesoftfactory.com/developer/textures.htm


先简单介绍一下纹理过滤"
Direct3D渲染一个图元时,会将三维图元映射到二维屏幕上。
如果图元有纹理,Direct3D就必须用纹理来产生图元的二维渲染图象上每个像素的颜色。
对于图元在二维屏幕上图象的每个像素来说,都必须从纹理中获得一个颜色值。
我们把这一过程称为纹理过滤(texture filtering)。

  进行纹理过滤时,正在使用的纹理通常也正在被进行放大或缩小。换句话说,
这个纹理将被映射到一个比它大或小的图元的图象上。
纹理的放大会导致许多像素被映射到同一个纹理像素上。
那么结果看起来就会使矮矮胖胖的。
纹理的缩小会导致一个像素被映射到许多纹理像素上。
其结果将会变得模糊或发生变化。
要解决这些问题,我们可以将一些纹理像素颜色融合到一个像素颜色上。

Direct3D提供了一些方法来简化纹理过滤的过程。
它提供了三种类型的纹理过滤:
线性过滤(linear filtering)、
各向异性过滤(anisotropic filtering)和mipmap过滤(mipmap filtering)。
如果不选择纹理过滤,Direct3D还会使用一种叫做最近点采样(nearest point sampling)的技术。

  每种类型的纹理过滤都有各自的优缺点。
例如,线性过滤会产生锯齿状的边缘和矮胖的效果。
但是,它对系统的消耗却是最小的。另一方面,mipmap过滤的效果通常是最好的,
特别是和各项异性过滤混合使用时。但是它却需要很大的内存消耗。
具体介绍:
http://www.gameres.com/Articles/Program/Visual/3D/d3dimhlp/d3dim6_19.htm
可惜是6.0版本的Direct3D,所以可以看看文章的思想,具体实现部分就不用看了
 
再转一篇关于Direct3D9纹理过滤器各个参数的意义的文章,是燕尘翻译的:
他的网址是http://www.yanchen.com/
我跟他蛮熟的,他在我入门的时候给过我帮助,
所以转了也就不通知他了,相信他也不会怪我.

IDirect3DDevice9::SetSamplerState Method
--------------------------------------------------------------------------------
设置纹理采样器的状态值。

语法:
HRESULT SetSamplerState(     
    DWORD Sampler,                           // 采样器编号
    D3DSAMPLERSTATETYPE Type,      // 采样器状态类型
    DWORD Value                               // 采样器状态所对应的值
);
--------------------------------------------------------------------------------

其中的 Type 在 D3DSAMPLERSTATETYPE 中枚举:


D3DSAMPLERSTATETYPE Enumerated Type
--------------------------------------------------------------------------------
采样器状态定义纹理的采样操作,例如纹理定位和纹理过滤。一部分采样器状态配置顶点处理,一部分配置像素处理。采样器状态可以通过状态块保存和恢复。

语法:
typedef enum _D3DSAMPLERSTATETYPE {
    D3DSAMP_ADDRESSU = 1,                    // 纹理坐标定位 U
    D3DSAMP_ADDRESSV = 2,                    // 纹理坐标定位 V
    D3DSAMP_ADDRESSW = 3,                   // 纹理坐标定位 W 
    D3DSAMP_BORDERCOLOR = 4,              // 边框颜色
    D3DSAMP_MAGFILTER = 5,                   // 放大过滤类型
    D3DSAMP_MINFILTER = 6,                    // 缩小过滤类型
    D3DSAMP_MIPFILTER = 7,                    // 多纹理过滤类型
    D3DSAMP_MIPMAPLODBIAS = 8,           // 多纹理层次细节指数
    D3DSAMP_MAXMIPLEVEL = 9,               // 最大多纹理层次
    D3DSAMP_MAXANISOTROPY = 10,        // 最大各向异性指数
    D3DSAMP_SRGBTEXTURE = 11,            // 伽玛校正系数
    D3DSAMP_ELEMENTINDEX = 12,           // 多元素纹理元素索引
    D3DSAMP_DMAPOFFSET = 13,              // 位移贴图偏移
    D3DSAMP_FORCE_DWORD = 0x7fffffff   //
} D3DSAMPLERSTATETYPE;
--------------------------------------------------------------------------------


其中,
    D3DSAMP_ADDRESSU = 1,                    // 纹理坐标定位 U
    D3DSAMP_ADDRESSV = 2,                    // 纹理坐标定位 V
    D3DSAMP_ADDRESSW = 3,                   // 纹理坐标定位 W 
这三个状态的类型(Type)在 D3DTEXTUREADDRESS 中枚举:

D3DTEXTUREADDRESS Enumerated Type
--------------------------------------------------------------------------------
定义常量,用于描述支持的纹理定位模式。

语法:
typedef enum _D3DTEXTUREADDRESS {
    D3DTADDRESS_WRAP = 1,                          // 覆盖:重复铺满整个表面
    D3DTADDRESS_MIRROR = 2,                        // 镜像:单行(列)与双行(列)镜像对称
    D3DTADDRESS_CLAMP = 3,                         // 剪裁:UV超出[0,1]范围之外的设为黑色
    D3DTADDRESS_BORDER = 4,                       // 边框: UV超出[0,1]范围之外的设为边框色
    D3DTADDRESS_MIRRORONCE = 5,                // 镜像一次:仅作一次镜像对称,
                                                                    // 范围之外设为黑色
    D3DTADDRESS_FORCE_DWORD = 0x7fffffff   //
} D3DTEXTUREADDRESS;
--------------------------------------------------------------------------------


    D3DSAMP_MAGFILTER = 5,                   // 放大过滤类型
    D3DSAMP_MINFILTER = 6,                    // 缩小过滤类型
    D3DSAMP_MIPFILTER = 7,                    // 多纹理过滤类型
这三个状态的类型(Type)在 D3DTEXTUREFILTERTYPE 中枚举:

D3DTEXTUREFILTERTYPE Enumerated Type
--------------------------------------------------------------------------------
定义纹理过滤器模式。

语法:
typedef enum _D3DTEXTUREFILTERTYPE {
    D3DTEXF_NONE = 0,                           // 无
    D3DTEXF_POINT = 1,                          // 点过滤
    D3DTEXF_LINEAR = 2,                         // 线性过滤
    D3DTEXF_ANISOTROPIC = 3,               // 各向异性过滤
    D3DTEXF_PYRAMIDALQUAD = 6,          // 锥体四次过滤
    D3DTEXF_GAUSSIANQUAD = 7,            // 高斯四次过滤
    D3DTEXF_FORCE_DWORD = 0x7fffffff   //
} D3DTEXTUREFILTERTYPE;

你可能感兴趣的:(Direct3D9学习手记(6)纹理过滤器)