精品学习网->精美文摘

上一篇    全部文章
WebGL的EXT_texture_filter_anisotropic扩展

WebGL的EXT_texture_filter_anisotropic扩展



各项异性滤波简单介绍AnisotropicFiltering(AF)

本⽂主要整理简绍来⾃互联⽹的各项异性滤波的知识。 主要的纹理过滤 纹理是数据的简单矩阵排列——⽐如。颜⾊数据、亮度数据或者颜⾊和alpha(透明度)数据。纹理数组中的每个独⽴的数值通常称为⼀个纹理单元。 纹理映射是⼀种将纹理图像应⽤于物体表⾯的技术(就是把图像贴到构成物体表⾯的多边形上去),就像该图像是⼀种贴画纸或玻璃纸附着于物体的表⾯上。 那么什么是纹理过滤呢?当三维空间⾥⾯的多边形经过坐标变换、投影、光栅化等过程,变成⼆维屏幕上的⼀组象素的时候。对每⼀个象素须要到对应纹理图像中进⾏採样,这个过程就称为纹理过滤。 纹理过滤通常分为2种情况: 1. 纹理被缩⼩。⽐⽅说⼀个8 x 8的纹理贴到⼀个平⾏于xy平⾯的正⽅形上,最后该正⽅形在屏幕上仅仅占4 x 4的象素矩阵,这样的情况下⼀个象素相应着多个纹理单 元。 2. 纹理被放⼤。 这样的情况刚好跟上⾯相反。假如我们放⼤该正⽅形,最后正⽅形在屏幕上占了⼀个16 x 16的象素矩阵,这样就变成⼀个纹理单元相应着多个象素。 通常的纹理过滤的⽅法有2种:线性过滤和三线性过滤。也能够设置不进⾏不论什么过滤操作。(同意为上⾯两种情况分别设置不同的过滤⽅法) 1. 不进⾏不论什么过滤操作的速度最快也最简单。仅仅是针对每个象素对最接近它的纹理单元进⾏採样。可⽤于上⾯两种情况。 可是这样的纹理过滤⽅法的效果最差,在屏幕显⽰的图像会显得⼗分模糊。 2. 线性过滤也⽐較简单。每个象素要对最接近它的2 x 2的纹理单元矩阵进⾏採样,取4个纹理单元的平均值。也可⽤于上⾯的两种情况。这样的纹理过滤⽅法的效果⽐ 上⾯的要好⾮常多。 3. 三线性过滤相对的⽐較复杂,它仅仅能⽤于纹理被缩⼩的情况,须要先构造纹理图像的mipmap,mip的意思是“在狭窄的地⽅⾥的很多东西”,mipmap就是对最初的 纹理图像构造的⼀系列分辨率降低⽽且预先过滤的纹理图。对于⼀个8 x 8的纹理来说须要为它构造4 x 4、2 x 2、1 x 1这三个mipmap。 假设正⽅形被缩⼩到在屏幕上占6 x 6的象素矩阵,⼀个象素的採样过程就变成这样。⾸先是到8 x 8的纹理图中进⾏对最接近它2 x 2的纹理单元矩阵进⾏採样(也就是上⾯的线性过滤);其次是到4 x 4的纹理图中反复上⾯的过程;接着把上⾯两次採样的结果进⾏加权平均,得到最后的採样数据。能够看出整个过程⼀共进⾏了三次的线性过滤。所以这样的⽅法叫做三线性过滤,它的效果是三种纹理过滤⽅法⾥⾯最好的。 各异向性纹理过滤 各异向性纹理过滤不是单独使⽤⽽是和前⾯所述的其它过滤⽅法结合⼀起使⽤的。 如果Px为纹理在x坐标⽅向上的缩放的⽐例因⼦。Py为纹理在y坐标⽅向上的缩放的⽐例因⼦。Pmax为Px和Py中的最⼤值。Pmin为Px和Py中的最⼩值。当Pmax/Pmin 等于1时。也就是说Px等于Py,纹理的缩放是各同向的;可是如果Pmax/Pmin不等于1⽽是⼤于1,Px不等于Py,也就是说纹理在x坐标⽅向和在y坐标⽅向缩放的⽐例不⼀样,纹理的缩放是各异向的,Pmax/Pmin代表了各异向的程度。 举个样例来说,64 x 64的纹理贴到⼀个開始平⾏于xy平⾯的正⽅形上。可是正⽅形绕y轴旋转60度。最后投影到屏幕上占了16 x 32的象素矩阵。 纹理在x坐标⽅向上缩放的⽐例因⼦为64/16等于4,在y坐标⽅向缩放的⽐例因⼦为64/32等于2,Pmax等于4,Pmin等于2。缩放的各异向程度为2。 当把各异向性过滤和线性过滤结合起来的时候。应该是对最接近象素的4 x 2的纹理单元矩阵採样才合理,由于⼀个象素在x坐标⽅向上相应了很多其它的纹理单元(Px > Py)。 即使是纹理在⼀个轴⽅向上缩⼩⽽在还有⼀个轴⽅向上放⼤,处理的过程也是⼀样的(注意的是如果纹理在⼀个轴⽅向上缩⼩⽽在还有⼀个轴⽅向上放⼤,仍然把它当作是纹理被缩⼩的情况。将採⽤为纹理缩⼩情况设置的过滤⽅法为基本过滤⽅法。然后再加上各异向性过滤)。如果被贴图的正⽅形最后在屏幕上占了⼀个128 x 32 的象素矩阵。纹理在x坐标⽅向上缩放的⽐例因⼦为64/128等于0.5,在y坐标⽅向缩放的⽐例因⼦为64/32等于2,因为Py > Px 且 Pmax/Pmin等于4,所以当把各异向性过滤和线性过滤结合起来的时候。应该对最接近象素的2 x 8的纹理单元矩阵进⾏採样。 三线性过滤和各异向性过滤结合的过滤⽅法的步骤跟前⾯单独的三线性过滤⽅法⼤致是⼀样的,仅仅是前⾯两步採⽤了各异向性过滤和线性过滤结合的⽅法。 通常情况下採取线性过滤或者三线性过滤就能够得不错的效果。可是在某些特殊的情况下,特别是把⼀个都是线状条纹的纹理图贴到⼀个绕x或者是y轴旋转⾓度⾮常⼤的多边形上的时候,⽐⽅将⼈的头发纹理贴到构成⼈的头顶的多边形,即使是三线性过滤的效果也不能令⼈惬意,仅仅有将各异向过滤⽅法和三线性过滤或者线性过滤的⽅法结合起来才⼲得到完美的效果。 如何在中使⽤各异向性纹理过滤 在⾥⾯使⽤各异向性纹理过滤首先要系统执⾏的实现⽀持EXT_texture_filter_anisotropic 这个扩展。 ⾥⾯的各异向性纹理过滤的參数设置是独⽴于纹理缩⼩和放⼤这两种情况的。也就是说不须要为这两种情况进⾏分别设置。參数设置⼗分简单,仅仅有⼀个參数就是最⼤各异向程度(TEXTURE_MAX_ANISOTROPY_EXT)。由于纹理缩放的各异向程度越⼤,就须要对很多其它的纹理单元进⾏採样,这样在处理速度上是不可接受的,所以必须设置⼀个最⼤各异向程度。当进⾏各异向性过滤的时候,採⽤的各异向程度參数为纹理缩放的各异向程度和最⼤各异向程度之间的最⼩值。也就是说当纹理缩放的各异向程度⼤于设置的最⼤各异向程度时。将使⽤设置的最⼤各异向程度作为过滤使⽤的參数。 显然可见,当该參数设置为1的时候就是不进⾏各异向性过滤。1也是为这个參数设定的缺省设置。另外还能够通过查询MAX_TEXTURE_MAX_ANISOTROPY_EXT获得该实现⽀持的最⼤各异向程度。 以下是使⽤各异向性纹理过滤的演⽰样例代码: glGenTextures(1&texture_id)); glBindTexture(GL TEXTURE 2D. texture id): //Create a 2D texture with Mipmap gluBuild2DMipmaps(GL TEXTURE 2D,GL RGB,m widthmheightGLRGBGLUNSIGNED BYTE,image data): //获得执行的Opengl实现支持的最大各异向程度 GLfloat largest supported anisotropic; glGetFloatv(GL MAX_TEXTURE MAX ANISOTROPY EXT,&largest supported anisotropic); 1/设置纹理缩小时探用的过滤方法。这里设置的是三线性过滤 qlTexParameteri(GL TEXTURE 2D.GL TEXTURE MIN FILTERGL LINEAR MIPMAP LINEAR) 1/设置纹理放大时探用的过滤方法,这里设置的是线性过滤 alTexParameteri(GL TEXTURE 2D.GL TEXTURE MAG FILTERGL LINEAR: //用 OponGL 实现支持的最大各异向程度设置最大各异向程度参数 glTexParameterf(GL TEXTURE 2DGL TEXTURE MAX ANISOTROPY EXT.largest supported anisotropic); 以下是使⽤各异向性纹理过滤的演⽰样例代码: 各项异性滤波简单介绍AnisotropicFiltering(AF) 各向异性过滤让表⾯倾斜物体纹理更加清晰锐利同⼀时候看上去⾮常密集。透明度⼜让密集的纹理变得模糊平缓。 各向异性过滤(Anisotropic Filtering ): 它是⽤来过滤、处理当视⾓变化导致3D物体表⾯倾斜时造成的纹理错误。 传统的双线性和三线性过滤技术都是指“Isotropy”(各向同性)的,其各⽅向上⽮量值是⼀致的,就像正⽅形和正⽅体。三线性过滤原理同双线性过滤⼀样。都是是将相邻像素及彼此之间的相对关系都记忆下来。然后在视⾓改变的时候绘制出来。 仅仅只是三线性过滤的採集范围更⼤。计算更精确,画⾯更细腻。 当然占⽤资源也很多其它。Anisotropic Filt技术的过滤单元并⾮“四四⽅⽅”的。其典型单元是矩形,还能够变形为梯形和平⾏四边形。画⾯上的⼀个象素,在⼀个⽅向上能够包括不同纹理单元的信息。 这就须要⼀个“⾮正多边形”的过滤单元。来保证准确的透视关系和透明度。不然,假设在某个轴上的纹理部分有⼤量信息。或是某个⽅向上的图象和纹理有个倾⾓,那么得到的终于纹理就会变得⾮常滑稽,⽐例也会失调。当视⾓为90度,或是处理物体边缘纹理时。情况会更糟。 各向异性过滤是最新型的过滤⽅法(相对各向同性2/3线性过滤),它须要对映射点周围⽅形8个或很多其它的像素进⾏取样。获得平均值后映射到像素点上。对于很多3D加速卡来说,採⽤8个以上像素取样的各向异性过滤差点⼉是不可能的,由于它⽐三线性过滤须要很多其它的像素填充率。可是对于3D游戏来说,各向异性过滤则是⾮常重要的⼀个功能,由于它能够使画⾯更加逼真,⾃然处理起来也⽐三线性过滤会更慢。 原⽂链接:http://doc.docsou.com/blog/762948 1、为什么在纹理採样时须要texture filter(纹理过滤)。 我们的纹理是要贴到三维图形表⾯的,⽽三维图形上的pixel中⼼和纹理上的texel中⼼并不⼀⾄(pixel不⼀定相应texture上的採样中⼼texel)。⼤⼩也不⼀定⼀⾄。 当纹理⼤于三维图形表⾯时,导⾄⼀个像素被映射到很多纹理像素上;当维理⼩于三维图形表⾯时。很多个象素都映射到同⼀纹理。 当这些情况发⽣时,贴图就会变得模糊或发⽣错位,马赛克。要解决此类问题。必须通过技术平滑texel和pixel之间的相应。 这样的技术就是纹理滤波。 不同的过滤模式。计算复杂度不⼀样,会得到不同的效果。过滤模式由简单到复杂包含:Nearest Point Sampling(近期点採样)。Bilinear(双线性过滤)、Trilinear(三线性过滤)、Anisotropic Filtering(各向异性过滤)。 在了解这些之前,有必要了解什么是MipMap和什么时各向同性。各向异性。 2、什么是MipMap? Mipmap早已被硬件⽀持,硬件会⾃⼰主动为创建的Texture⽣成mipmap的各级。在D3D的API:CreateTexture中有⼀个參数levels,就是⽤于指定⽣成mipmap到哪个级别,当不指定时就⼀直⽣成到1X1。 3、什么是各向同性和各向异性? 当须要贴图的三维表⾯平⾏于屏幕(viewport),则是各向同性的。当要贴图的三维表⾯与屏幕有⼀定⾓度的倾斜,则是各向异性的。 也能够这样理解。当⼀个texture贴到三维表⾯上从Camera看来没有变形。投射到屏幕空间中后U⽅向和V⽅向⽐例仍然是⼀样的,便能够理解成各向同性。 反之则觉得是各向异性。 4、 Nearest Point Sampling(近期点採样) 这个最简单,每⼀个像素的纹理坐标,并⾮刚好相应Texture上的⼀个採样点texel。怎么办呢?近期点採样取最接近的texel进⾏採样。 当纹理的⼤⼩与贴图的三维图形的⼤⼩⼏乎相同时,这样的⽅法很有效和快捷。假设⼤⼩不同,纹理就须要进⾏放⼤或缩⼩。这样,结果就会变得矮胖、变形或模糊。 5、 Bilinear(双线性过滤) 双线性过滤以pixel相应的纹理坐标为中⼼,採该纹理坐标周围4个texel的像素,再取平均,以平均值作为採样值。 双线性过滤像素之间的过渡更加平滑,可是它仅仅作⽤于⼀个MipMap Level,它选取texel和pixel之间⼤⼩最接近的那⼀层MipMap进⾏採样。当和pixel⼤⼩匹配的texel ⼤⼩在两层Mipmap level之间时,双线性过滤在有些情况效果就不太好。于是就有了三线性过滤。 6、 Trilinear(三线性过滤) 三线性过滤以双线性过滤为基础。会对pixel⼤⼩与texel⼤⼩最接近的两层Mipmap level分别进⾏双线性过滤,然后再对两层得到的结果进⽣线性插值。 三线性过滤在普通情况下效果很理想了。可是到眼下为⽌,我们均是如果是texture投射到屏幕空间是各向同性的。可是当各向异性的情况时,效果仍然不理想。于是产⽣了Anisotropic Filtering(各向异性过滤)。 7、 Anisotropic Filtering(各向异性过滤) 各向同性的过滤在採样的时候。是对正⽅形区域⾥⾏採样。 各向异性过滤把纹理与屏幕空间的⾓度这个因素考虑时去。简单地说,它会考滤⼀个pixel(x:y=1:1)相应到纹理空间中在u和v⽅向上u和v的⽐例关系,当u:v 不是1:1时,将会按⽐例在各⽅向上採样不同数量的点来计算终于的结果(这时採样就有可能是长⽅形区域)。 我们⼀般指的Anisotropic Filtering(AF)均是基于三线过滤的Anisotropic Filtering,因此当u:v不为1:1时,则Anisotropic Filtering⽐Trilinear须要採样很多其它的点,详细要採多少,取决于是多少X的AF,如今的显卡最多技持到16X AF。 当开启16X AF的时候,硬件并⾮对全部的texture採样都⽤16X AF。⽽是须要先计算屏幕空间与纹理空间的夹⾓(量化后便是上⾯所说的u:v),仅仅有当夹⾓⼤到须要16X时,才会真正使⽤16X. 假设想了解AF的实现原理,能够查阅此篇Paper: “Implementing an anisotropic texture filter”. 如今AF都是硬件实现,因此仅仅有少数⼈才清楚AF就尽是如何实现了(事实上细节我也没搞清楚),事实上全然能够由Pixel Shader来实现AF,当然性能和由硬件做是没得⽐的。 8、各过滤模式性能⽐較。 下表是各种过滤模式採⼀个pixel须要sample的次数: Sample Number Nearest Point Sampling1 Bilinear4 Trilinear8 Anisotropic Filtering 4X32 Anisotropic Filtering 16X128 4X是三次过滤的四倍,是以三次过滤为基准进⾏⽐較的。 Anisotropic Filtering 16X效果最好。可是显卡Performance会下降⾮常多,当然也是測试你⼿中显卡Texture Unit的好⽅法。假设你认为你的显卡够⽜。那么就把AA 和AF都打到最⾼再试试吧:) 各项异性过滤 各项异性过滤(AF)是⼀种通⽤的纹理质量增强技术。可影响纹理在⾮正交视⾓下的外观。 纹理是包括各种数据的图像,⽐⽅颜⾊、透明度、反射率和平滑度(法线)。 这些数据映射到物体并经过G PU处理。以便于在屏幕上呈现真实的外观。但就其原始维度来说,⼤多数纹理都由于计算开销过⼤⽽不能在场景中⽆限制重⽤。由于物体的纹素(1像素纹理)与照相机之间的相对距离会影响细节的可⻅程度。这常常会导致浪费⼤量处理时间来获取3D场景中不成⽐例的⼩曲⾯上应⽤的多重纹理样本。 为了同⼀时候保证性能和图像质量,AF使⽤了m ipm ap;m ipm ap是以较低分辨率呈现的主纹理副本。当对应曲⾯与照相机之间的距离达到指点值时。图形引擎便可调⽤它。经过适当过滤之后。在⼀个场景中使⽤多种m ipm ap⽔平不仅不会对其外观造成的太⼤的影响,同⼀时候还能够极⼤地优化性能。 因为m ipm ap的维度⼀般是2的幂,或者⼩于原始纹理,因此有时须要为⼀个纹素採样多个m ipm ap,⽽这要求使⽤过滤⽅法来避免模糊和其它失真现象。默认的双线过滤是最简单、计算开销最⼩的过滤⽅法:它计算纹理的终于颜⾊。依据图形引擎对适当点(⺫标纹理存在于屏幕上时)定义的m ipm ap运⾏4次採样,这些样本的颜⾊数据将合成为终于结果。尽管这在⼀定程度上会造成纹理⾓度扭曲,但双线过滤仅对图形引擎确定的m ipm ap运⾏採样,这意味着调⽤了两种不同m ipm ap⼤⼩的纹理在出现⾓度扭曲后会对其清晰度产⽣显著的影响。 作为双线过滤的视觉连续⽅法,三线过滤能够连续对⺫标纹素的相邻m ipm ap採样和拉平纹理数据,因此在m ipm ap之间提供了平滑的转换。 但这样的⽅法与双线过滤都假定纹理在照相机前显⽰为⽅块。从⽽影响纹理在较⼩视⾓下的质量。其原因在于纹素⽐m ipm ap样本⻓或宽会分别造成过度採样或採样不⾜,从⽽导致图像模糊。 各项异性过滤的⺫的是在各种情况下都能提供出⾊的图像质量,同⼀时候将性能开销控制在较低的⽔平。 依据计算机科学的定义,各项异性是处理同⼀空间中相异坐标的质量,这适⽤于在显⽰时未与照相机绝对正交的纹理。 如前所述。当採样纹理与照相机斜交时。双线和三线过滤终于都会造成质量丢失,由于两种⽅法在从m ipm ap获取纹理採样时都假定映射纹理在所呈现的空间中为绝对的⽅形。这⾮常少能产⽣真实的效果。 m ipm ap的等⽅性(即使⽤同样的维度)也是造成质量丢失的还有⼀个原因,因此当纹素为梯形时就⽆法在两个⽅向上充⾜採样。为了解决此问题,各项异性过滤将依据纹理的⾓度扭曲程度按⽐例扩展mipmap的⾼度和宽度。该⽐例取决于所指定的最⼤採样值。然后将运⾏适当的採样。 AF⽀持的各项异性⽔平范围是1(⽆扩展)到16,这些值定义了m ipm ap可扩展的最⼤程度,但AF为⽤户提供的扩展⽔平通常为2的幂:即2x、4x、8x和16x。 这些设置之间的差别在于AF过滤纹理的最⼤⾓度不同。 举例来说,4x过滤纹理的⾓度⽐2x陡两倍。但仍然在2x范围内对纹理运⾏标准2x过滤来优化性能。使⽤的AF设置越⾼,能获得的收益也会更⼩,由于它们所适⽤的⾓度会呈指数形式降低。 本文摘自:https://doc.docsou.com/b18d043ee783032c8b746eedbb343ff58c54fe60e.html

     返回顶部
WebGL的EXT_texture_filter_anisotropic扩展