前言
在3D渲染中,纹理主要用来承担表皮贴图的作用,像人的皮肤一样。
纹理最终呈现到屏幕上的质量主要取决于纹理和成像区域的比例、采样模式、以及多级纹理映射质量。
在搁置渲染过程的情况下,去探讨这件事情
了解纹理采样和多级纹理映射技术,可以让我们更好的控制纹理输出的基本质量,同时了解多级纹理映射流还能使我们对于纹理的内存开销得到很好的控制。
在这里我们只探讨如何应用他们,以及不同选项呈现的效果差异。
Filter Mode(纹理采样的过滤模式)
我们在片元素阶段,需要三角面片每个像素的颜色值,其中通过给定的UV坐标在纹理上查找或者计算颜色值的这个行为就是采样。
在Unity中一共为纹理提供了Point、 Bilinear、Trilinear三种采样的过滤模式。
-
Piont 模式:Point模式是最快的,它不需要插值,只需要根据UV坐标找到对应的像素值即可。
-
Bilinear模式:又叫做双线性过滤,以采样点为中心分别对U轴和V轴进行邻近插值。
-
Trilinear模式:又叫做三线性过滤,以采样点为中心不仅要对U轴和V轴进行插值,还要对投入应用的不同的Mipmap等级的纹理进行插值。
在不应用多级纹理映射技术的情况下,三种插值模式人眼很难分辨出区别。
但是,在不应用多级纹理技术的情况下,渲染对象随着镜头的拉远,会出现失真的情况。
从图中可以看到,当渲染对象在屏幕上呈现的区域比纹理原有的尺寸小很多时,右边的图看起来更加自然,所以,动态视角下的场景中,Mipmap成为了一项不得不去应用的技术。
Mipmap(多级纹理映射)
为了解决渲染对象在屏幕上呈现区域与纹理尺寸不对称的问题,与是就有了Mipmap(多级纹理映射)方案。
Mipmap技术总能在适当的时机选择一个适合的纹理尺寸作为渲染对象输出的目标纹理。
在Unity中Mipmap等级一共分为14个等级,其中最高的对应Unity支持的最高的纹理尺寸8192*8192。每降低一个等级纹理尺寸减少1倍,如Mipmap13等于4096*4096,而Mipmap12等于2048*2048,以此类推直到等级1。
但在实际的应用过程中,Unity只允许渲染对象使用最高档次Mipmap在三个等级中过度。
例如,渲染对象的原始纹理为2048*2048对应Mipmap12,那么它在屏幕上越来越小时,使用的最高档次Mipmap等级是10。(这是在默认设定下)
在图M-1中可以清楚的看到渲染对象经过多张不同尺寸的纹理进行采样处理。
即便应用多纹理映射技术,渲染质量依旧有锯齿、拼接痕迹等问题,因此就有了Bilinear,Trilinear,去解决在Mipmap技术下带来的瑕疵。
图M-3~5效果相仿,同时与M-1、M-2有人眼可识别的差异,M-3~5就是一个纹理在Mipmap和Filter Mode的同时作用下,在屏幕上产生的比较好的基础状态。
但是,Mipmap依然有缺陷,使用它意味着增加了内存开销,为了解决这一问题,Unity又推出了MipmapStreaming技术。
Mipmap Streaming(多级纹理映射流)
应用
使用它以为着你可以不把所有Mipmap都载入到内存,而是随着摄像机的距离渲染物体的距离,而动态的载入需要的Mipmap等级,它可以使我们在某些情况下只维护只有几百KB的Middle Mipmap。
1.启用Mipmap Streaming功能
打开选项 Edit>Project Settings>Quality

2.为摄像机配置 Streaming Controller

3.启用纹理的Mipmap Streaming功能

现在,我们已经完成了纹理的Mipmap Streaming的配置工作。
调试(IN URP)
注意:Build-In 工程不支持DEBUG功能
效果视频
多级纹理渐进映射技术效果
题外扩展
使用 Mipmap Limit Group 同一控制输出纹理的基本尺寸
1. 配置Mipmap Limit Group&全局选项
Global Mipmap Limit:
Full Resolution(全分辨率)
Half Resolution(半分辨率)
Quater Resolution(四分之一分辨率)
Eighth Resolution(八分之一分辨率)
Mipmap Limit Groups
Offset Global Mipmap Limit +1(TopLv-1)
Offset Global Mipmap Limit +2(TopLv-2)
Offset Global Mipmap Limit -1(LowLv+1)
Offset Global Mipmap Limit -2(LowLv+2)
前面提到了,TopLv就是当前对象应用的最顶级的Mipmap等级,在远近变换时,默认情况下TopLv只允许在三个等级间过度,LowLv是在Mipmap Streaming系统中渐进时变换的最高等级的最低级形态(说的有点绕了)。
2. 配置纹理的Mipmap Limit Group选项
我的原始纹理是MipmapLv12,配置了TopLevel-1,Mipmap的输出区间就被限制到了11~10。同理,配置了TopLevel-2,就会被限制到10~10,配置了TopLevel-3就会被限制到9~9。
控制单个纹理的Mipmap等级
我们可以通过Texture实例的mipmapBias字段控制某一个纹理的Mipmap等级。
//> 示例代码
void SameClass:SetMipmapLevelForTextureInstance(int offset)
{
var render = gameObject.GetComponent<Renderer>();
render.material.mainTexture.mipMapBias = offset;
}
举例说明:假设纹理本身应用Mipmap Limit Group TopLevel-3,在原始纹理等于Lv12的情况下,应该输出Mipmap Lv9,此时,再通过代码设置Offset = 3,那么最终的Top Mipmap Level会是6,通过代码控制与通过纹理的 Mipmap Limit Group控制是叠加关系。
FAQ
所有设置都配置了在渲染窗口使用显示最高级的Mipmap怎么办?
这个功能还是有点小问题的,你可以尝试到Edit>Project Settings>Quality中逛一圈,最后的办法就是重启Unity。
打包在真机上测试如何打开调试窗口?
真机上三根手指双击两下
真机上调试窗口里的无法正常预览MipmapStreaming功能?
看看Project Setting>Graphics>Strip Runtime Debug Shader 选项是否已经取消勾选
在真机上调试Strip Runtime Debug Shader 要取消勾选
怎么为渲染对象选择合适尺寸的纹理?
- 确定渲染输出的分辨率
- 确定渲染对象在渲染分辨率下最大的显示尺寸
- 确定渲染对象在此显示尺寸下的渲染频率
例如:玩家手里的武器,玩家通过滚轮查看武器细节时,武器的贴图最多只能在横轴或纵轴上覆盖1024个像素,那么采用2048的像素纹理就显得很浪费了。同理,游戏场景中用于烘托气氛的远景山,山上有很多植被,玩家无法到达那里查看植被的细节,其植被在屏幕上的像素不足256*256,那么远景山上的植被就可以使用256*256的纹理。
3万+

被折叠的 条评论
为什么被折叠?



