您的位置:首页 > 其它

纹理过滤相关内容

2014-07-09 12:41 197 查看
最近的工作涉及到了纹理过滤的知识,然后就开始回想起来以前的储备知识,结果发现自己的储备简直是弱爆了,因此查了点资料,总计写记录下来,一边以后翻阅

d3d支持的纹理过滤类型是3中:

最近点采样,

线性纹理过滤,

各向异性(anisotropic)纹理过滤

但是在游戏中一般会分为4种:

点采样、设置方式:

g_device->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_POINT);

g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);

//////////////

g_device->SetSamplerState(0,
D3DSAMP_MIPFILTER, D3DTEXF_POINT);

g_device->SetSamplerState(0,
D3DSAMP_MAXMIPLEVEL, 16);

或者 g_device->SetSamplerState(0,
D3DSAMP_MIPFILTER, D3DTEXF_NONE);

双线过滤(即D3D的线性纹理过滤),

g_device->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

g_device->SetSamplerState(0,
D3DSAMP_MIPFILTER, D3DTEXF_POINT);

g_device->SetSamplerState(0,
D3DSAMP_MAXMIPLEVEL, 16);

三线过滤(即 D3D中的线性过滤加上mipmap),(mipmap就是指多级渐进形纹理)

g_device->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

g_device->SetSamplerState(0,
D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

g_device->SetSamplerState(0,
D3DSAMP_MAXMIPLEVEL, 16);

各向异性过滤

g_device->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);

g_device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);

g_device->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 4);

总之多级渐进性纹理和d3d三种基本的纹理过滤方式搭配使用 ,产生了很多丰富的效果。

借阅相关的博客:
http://www.cppblog.com/lovedday/archive/2008/05/20/50567.html http://www.cnblogs.com/hcbin/archive/2010/05/31/1748623.html
以下的这段话很关键:

首先从MIPMAP的原理说起,它是把一张贴图按照2的倍数进行缩小。直到1X1。把缩小的图都存储起来。在渲染时,根据一个像素离眼睛为之的距离,来判断从一个合适的图层中取出texel颜色赋值给像素。在D3D和OGL都有相对应的API控制接




透过它的工作原理我们可以发现,硬件总是根据眼睛到目标的距离,来玄奇最适合当前屏幕像素分辨率的图层。假设一张32768x32768的mipmap贴图,当前屏幕分辨率为1024*1024。眼睛距离物体比较近时,mipmap最大也只可能从1024*1024的Mipmap图层选取texel。再次,当使用三线性过滤(trilinear)时,最大也只能访问2048*2048的图层选取texel,来和1024*1024图层中的像素进行线性插值。


为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap

多级渐进纹理由一组分辨率逐渐降低的纹理序列组成,每一级纹理宽度和高度都是上一级纹理宽度和高度的一半。宽和高不一定相等,也就是说,这些纹理不一定都是正方形。

Direct3D在纹理映射时,自动选择一幅与物体大小最接近的纹理进行渲染。当物体离投影平面较远时,Direct3D会选择一张尺寸较小、分辨率较低的纹理进行渲染;当物体离投影平面较近时,Direct3D会选择一张尺寸较大、分辨率较高的纹理进行渲染。Direct3D将纹理序列看成一条多级渐进纹理链。链头处纹理的分辨率最高,下一级往后依次递减,链尾处纹理的分辨率最低。

Direct3D能估计出多级渐进纹理链中哪幅纹理的分辨率最接近想要的输出结果,然后它将像素映射到纹理空间。当最终显示的图形大小介于任意两级纹理图形之间时,Direct3D将两级纹理的相应元素进行混合后显示。

多级渐进纹理过滤能够有效地提高图形渲染速度,当物体离投影平面较远时,Direct3D会选择一张尺寸较小的纹理进行渲染,而无需经过复杂的诸如各项异性纹理过滤,并且由于这时纹理需要的显存比不使用多级渐进纹理时小,因此能有效地减少纹理载入显存的时间。
缺点是对内存的要求比较高



///////

16位色的256*256的纹理使用128K内存,如果在该纹理中再加一个多纹理映射还需要额外的43K内存

/////// 原因在这

设置多级渐进纹理过滤方式

当最终显示的纹理贴图大小介于任意两级纹理之间时,Direct3D能够取得两级纹理元素进行混合后显示,具体的混合方式由指定的多级渐进纹理过滤方式决定。可以调用函数IDirect3DDevice9::SetSamplerState()设置多级渐进纹理过滤方式,将第一个参数设为纹理层序号,第二个参数设为D3DSAMP_MIPFILTER表示多级渐进纹理过滤,第三个参数设为在相邻纹理级之间的过滤方式,可取枚举类型D3DTEXTUREFILTERTYPE的任意值。下面的示例代码设置相邻纹理级之间的过滤方式为线性过滤。

g_device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

如果将第三个参数设为D3DTEXF_NONE,那么就会一直使用最高一级的纹理,即禁用多级渐进纹理过滤。如果将其设为D3DTEXF_POINT,就会只使用与图元大小最匹配的一级纹理。如果将其设为D3DTEXF_LINEAR,Direct3D就将与图元大小最匹配的两级纹理以线性方式混合。

需要注意的是,多级纹理过滤是缩小和放大过滤器的结合。例如,如果将缩小和方法过滤器设为线性过滤,但是多级纹理过滤方式设为最近点采样,Direct3D就会选择与要显示的纹理贴图大小最接近的纹理级别,在该级纹理上完成双线性纹理过滤,并将结果作为像素的值。如果将缩小、放大过滤器和多级渐进纹理都设置为线性过滤,则Direct3D就会在两个最接近的纹理级别上都进行双线性纹理过滤,然后再对相邻两级纹理图形上对应的两个纹理颜色进行加权平均,最后的结果作为单个像素值。这种为了图元中的一个像素,而结合了两幅纹理,共8个像素的技术,称为“三线性过滤”,因为它在纹理的三个方向----u、
v和纹理级别上都进行了线性过滤。

可以通过IDirect3DDevice9::SetSamplerState()函数设置实际渲染时纹理过滤的最大级数,其中需要将第二个参数设为D3DSAMP_MAXMIPLEVEL,第三个参数设为实际渲染时纹理过滤的最大级数。下面的示例代码设置纹理层0的最大多级纹理过滤级数为16。

g_device->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 16);

还可以通过将IDirect3DDevice9::SetSamplerState()的第二个参数设为D3DSAMP_MIPMAPLODBIAS,设置多级纹理映射级数偏移值。如果对某个纹理映射设置正偏移值,得到的图形结果就会比原来的更清晰,但锯齿更多;反之设为负偏移值,得到的图形结果就会更模糊。

以下这段话也很重要:

纹 理过滤:通过给定的uv坐标从纹理贴图中获得图素的一种方法。为了抗锯齿,D3D中采用了3中技术来实现纹理过滤,它们分别是最近点采样,线性纹理过滤, 各向异性(anisotropic)纹理过滤。而现在游戏中看到的图像高级选项中,一般都有点采样、双线过滤(即D3D的线性纹理过滤),三线过滤(即 D3D中的线性过滤加上mipmap),以及各向异性过滤。

mipmap:由一系列纹理组成,其中每张纹理的高宽都是前一级高宽的一半。D3D在渲染时会自动挑选出一个图素与像素的比值最接近于1的mip层级。

最近点采样:将纹理坐标对齐到最接近的整数,再将那个位于整数坐标上的纹理像素作为最终的颜色。缺点:容易在图像边界上造成错误,优点:快。

线性纹理过滤:(即双线纹理过滤),计算相对于采样点最近的4各图素(上下左右4个点)的平均值。缺点:有各项异性失真可能。

三线过滤:对于每个像素,三线过滤会先选择两张最接近的mipmap,将它们双线过滤为两张理想大小的mipmap,然后根据理想的mip级组合这两张过滤后的mipmap中的对应像素。缺点:有各项异性失真可能。

各项异性过滤:根据屏幕像素的伸张度来测量各项异性,再将屏幕像素反向映射到纹理空间中。效果:在非水平的渲染时要比三线过滤更加锐化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: