游戏纹理抖动的成因分析和解决方案
最近试用了下Unity,在开发的过程中发现了一个问题,在相机随主角移动的过程中,发现地图的细节部分不停的闪烁,非常讨厌,于是对这一问题进行研究。遂成此文。
一、问题
视频很好的展示了这个问题。我们用草地图片做背景,图片滤波模式设置为point,然后让摄像头沿着X轴缓慢移动,可以看到在移动过程中,图片的某些部分抖动得很厉害,这种程度的抖动对于一般游戏来说都是不可以接受的,因此网上也有些解决方案,但大部分人对抖动的成因理解不够,这篇文章将先分析抖动的成因,然后简单介绍下抖动的解决方案。
二、成因
我总是喜欢把结论写在前面,这样没有兴趣的同学就可以直接略过后面的大部分分析:抖动的成因:
1. 屏幕实际上是一个采样器,它对图像采样
2. 而根据奈奎施特采样定理,采样频率必须至少是图像频率的两倍,采样后的图像才能完整的代表原图像。
从这里我们可以知道,屏幕分辨率越低、图片高频信号越高,越容易产生抖动现象,比如把上图的图像代替成一个单色图像,显然是不会发送抖动的。
OK,下面开始具体的分析了,我们把图像经过屏幕显示的过程数学建模,图像经过屏幕显示呈现到人们面前,实际上是分成了两个步骤:
1. 采样:图像处理器从图像中选取一个或多个点平均,得到一个RGBA值,采样在shader中用tex2D函数实现,OpenGL有几种采样方式GL_NEAREST, GL_LINEAR和GL_LINEAR_MIPMAP_LINEAR,分别对应Unity的point, bilinear和trilinear三种采样模式。
2. 滤波:采样后的RGBA值通过像素发光,这是一个低通滤波器,把一个没有大小的RGBA值显示为一个像素大小的光点,可能大家对这步体验不够清楚,然而这确实有一个低通滤波的过程,不然人们只能在屏幕上看到一个个