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;