请问噪点纹理贴图纹理的原理是什么?求专业解释


如上图有两张贴图纹理,一张昰透明的一张是不透明的,在shader里如何才能弄出第三张图的效果我试了好多种方法都不行~~~~小弟也是刚接触shader,还请各位指点一二啊~~~~

在计算机图形学中纹理过滤或鍺说纹理平滑是在纹理采样中使采样结果更加合理,以减少各种人为产生的穿帮现象的技术纹理过滤分为放大过滤和缩小过滤两种类型。对应于这两种类型纹理过滤可以是通过对稀疏纹理插值进行填充的重构过滤(需要放大)或者是需要的纹理尺寸低于纹理本身的尺寸时(需偠缩小)的一种抗锯齿过滤。简单来讲纹理过滤就是用来描述在不同形状、大小、角度和缩放比的情况下如何应用纹理。根据使用的过滤算法的不同会得到不同等级的模糊、细节程度、空域锯齿、时域锯齿和块状结果。根据使用环境的不同过滤可能是在软件或者专用硬件中完成,也可能是在软件和专用硬件***同完成对用大多数常见的可交互图形应用,现代的纹理过滤是使用专用的硬件进行完成这些硬件通过内存缓冲和预提取技术优化了内存读写,并且实现了多种可供用户和开发者选择的过滤算法

有多种纹理过滤方法,不同的方法在计算复杂度、内存带宽和图像质量上分别有不同的权衡

对于任意的3D表面在纹理映射过程中,需要进行纹理查找来找到屏幕上的一个潒素对应于纹理上的哪个位置纹理映射的过程会根据目标点离相机的远近,占用屏幕上不同大小的范围的像素例如一个三角面在距离楿机20m时占用100个屏幕像素,当三角面离相机更远时会看起来更小此时可能占用20个屏幕像素,但是在两种情况下这个三角面使用的纹理贴图紋理的大小是不变的换句话说,由于纹理化表面可以相对于观察者处于任意距离和朝向因此一个像素通常不直接对应于一个纹理像素。必须应用某种形式的滤波来确定像素的最佳颜色滤波不足或不正确将在图像中显示为伪像(图像中的错误),例如“阻塞”锯齿状戓闪烁。

屏幕的一个像素与它在对应的纹素之间可以存在不同类型的对应关系这取决于纹理化表面相对于观察者的位置,并且在每种情況下都需要不同形式的过滤给定映射到世界中的正方形表面的正方形纹理,在某个观看距离处一个屏幕像素的大小与一个纹理像素完铨相同。当观察者靠近时纹素(纹理上一个颜色点)大小大于屏幕像素,需要适当放大 - 这一过程称为纹理放大更远时,每个纹素大小小于┅个像素因此一个像素覆盖多个纹素。在这种情况下必须通过纹理缩小来基于所覆盖的纹理元素拾取适当的颜色。图形API如OpenGL允许程序员為缩小和放大过滤设置不同的过滤方案

注意,即使在像素和纹素是完全相同的大小的情况下一个像素也不一定完全匹配一个纹素。它們可能未对齐或发生旋转一个像素可能覆盖多达四个相邻纹素的部分。因此仍然需要某种形式的过滤。

Mipmapping是一种标准技术用于保存纹悝缩小过程中所需的一些过滤工作。它对缓存一致性也非常有益- 没有它从远距离纹理采样期间的存储器访问模式将表现出极差的局部性,即使没有执行滤波也会对性能产生不利影响

在纹理放大时,需要为任何像素查找的纹素的数量总是四个或更少; 然而在缩小时,随着紋理多边形移动得更远潜在地整个纹理可能落入单个像素中。这将需要阅读所有它的纹素和它们的值组合以正确地确定像素颜色这是┅个非常昂贵的操作。Mipmapping通过预先过滤纹理并将其以较小的尺寸存储到单个像素来避免这种情况随着纹理表面移动得更远,应用的纹理切換到预过滤的较小尺寸mipmap的不同大小被称为“级别”,级别0是最大的级别(最接近观看者)并且随着距离增加,对应要增加mipmap等级

下面列出了几种最常见的过滤方法,按照顺序越靠后的运算开销越大,但采样结果效果也更好

最近点插值法是最简单的纹理过滤方法 — 使鼡最接近采样点纹素作为采样结果的颜色。 简单的代价就是会产生很多人为现象 - 在放大观察时会有明显色块(马赛克),而缩小时会有闪烁和鋸齿现象这种方法在放大的情况下非常快,但是在缩小时开销却极高因为屏幕上相邻的像素点,可能对应于纹理上距离很远的两个点而这会破坏纹理采样时的内存连续性,导致L1或者L2缓存的命中率极低使得纹理采样性能大大降低。
如上图可以看到大量的噪点这些噪點在运行时则会表现为闪烁,因为噪点基本是随机的

最近点插值+mipmap的方式

这种方式在最近点插值的基础上引入了mipmap,当距离相机很近时使鼡miplevel0,此时和最近点插值完全一样当距离下相机很远时,使用更高的miplevel等级此时使用最近点插值采样更小尺寸的纹理。因此可以缓解缩小時的闪烁和锯齿现象并且能够充分利用纹理采样时的内存连续性,使得纹理采样性能提高但是在纹理放大时,不能解决产生的色块现潒

加了mipmap之后可以看到噪点消失,但是远处纹理明显模糊而且不同mipmap过渡处有明显分界,而近处的纹理有明显锯齿

OpenGL和其他图形API提供在单独嘚mipmap层级的贴图纹理上进行最近点采样但是会对两个相邻的mipmap等级的采样结果进行插值,作为最终结果该方法很少使用

双线性过滤对于锯齒问题会有一个很明显的提升。该方法中采样目标点附近的4个纹素,并且根据权重(距离中心点的距离)进行加权平均这种方法使得放大紋理时的色块现象得以消失,因为此时两个相邻像素之间是平滑过度的当缩小纹理时可以结合mipmap进行使用,尽管当缩小很多时依然会有囷最近点过滤方法一样的锯齿和闪烁现象,但是对于大部分合理的缩小比例可以作为一种开销较少的有硬件加速的纹理超采样方案。

相仳最近点采样可以看到近处纹理空间的锯齿明显消失,但是不同mipmap等级见的分界依然明显

三线性过滤是对双线性过滤中当纹理距离相机的距离刚好处于两个mipmap等级的交界处时的明显的一个过渡现象的解决方案通过对两个相邻的mipmap等级的纹理进行双线性过滤采样,并对两个采样結果线性插值得到最终的颜色这样当纹理到相机的距离逐渐增加时,可以得到平滑的一个过渡而不是突兀的变化。当然对于足够近嘚纹理,因为使用miplevel0这个等级因此和双线性过滤完全一致。

三线性过滤解决了mipmap过渡中的分界问题但是对角方向上的纹理依然很奇怪,并苴异常模糊

到目前为止我们讨论的都是各向同性过滤方法也就是说在纹理采样时,不考虑纹理的xy轴与屏幕的xy轴的角度认为在任何角度時采样结果都是应该一致的(各向同性)。事实上各向异性过滤是当前消费级显卡中的最高质量的过滤方法。各向同性方案只使用了正方形嘚mipmap来应用于双线性或三线性纹理过滤(各向同性是指在所有方向上都相同用来描述所有的mipmap贴图纹理都是方形而不是在某一个轴向上有压缩嘚长方形或者其他形状)。

上图各向异性mipmap图片存储模式(左),和普通mipmap存储模式

当一个物体的表面和相机有很大的夹角时纹理在屏幕上的对应填充区域就不是方形的。例如一个地板距离相机远的地方,填充区域的宽高是不对等的此时方形的纹理贴图纹理就不是很合适了,此时僦会导致模糊或者闪烁或者两者皆有各向异性过滤通过采样一个非方形纹理解决了这个问题。

使用各向异性过滤之后纹理清晰度得到叻很大的提升

上图三线性过滤和各向异性过滤的区别,可以看到远处的地面明显清晰很多

其他纹理过滤方法,因为硬件支持不广泛很哆算法中使用的是软件实现,因此Unity引擎默认没有支持这里列举如下,欢迎补充:

参考资料

 

随机推荐