Unity中如何消除网格瓦片间条纹(无需Pixel Perfect Camera)
解决Unity网格瓦片间条纹/闪烁问题(无需Pixel Perfect Camera)
核心调整方向:消除亚像素偏移与纹理采样误差
1. Sprite导入与切片设置
- 将Sprite的
Filter Mode强制设为Point (no filter),彻底避免纹理插值导致的边缘模糊与条纹 - 在Sprite Editor中,把
Mesh Type改为Full Rect,禁用自动生成的Tight网格,防止UV坐标偏移引发的缝隙 - 确保
Pixels Per Unit与瓦片物理尺寸严格对应(如32x32像素瓦片设为32),后续所有相机、Tilemap设置都基于此值对齐
2. Tilemap与相机位置对齐
- Tilemap的
Cell Size保持为(1, 1, 0)(与PPU匹配),且Tilemap的Transform.Position必须是整数坐标,杜绝亚像素偏移 - 普通正交相机的
Transform.Position同样设为整数,2D场景中相机的小数位会导致所有瓦片整体偏移,产生缝隙 - 计算相机正交尺寸时,确保世界单位到屏幕像素的转换为整数倍:
正交尺寸 = (屏幕高度 / 2) / PPU,比如1080p屏幕+32PPU,正交尺寸为540/32=16.875,保证每个瓦片在屏幕上的像素数为整数
3. Sprite Atlas优化
- 在Sprite Atlas的
Packing Settings中,设置Padding为1-2像素,避免图集内相邻瓦片的边缘纹理被错误采样 - 关闭
Rotate选项,防止瓦片旋转后UV坐标错位引发的闪烁 - 不要给瓦片类Sprite开启
Allow Rotation,必须保持原始方向
4. 相机渲染设置调整
- 关闭相机的
Allow MSAA,抗锯齿会对瓦片边缘进行过度采样,反而产生条纹 - 将相机
Rendering Path设为Forward,延迟渲染的纹理采样逻辑可能导致2D瓦片出现异常缝隙 - 禁用相机的
Dynamic Resolution(若开启),动态分辨率缩放会破坏像素对齐
5. Shader层面的最终修正
- 使用Unity内置
Sprite-Defaultshader时,可自行修改片元着色器,对UV坐标做微小偏移,避免采样到纹理边缘的透明像素:fixed4 frag(v2f IN) : SV_Target { // 添加微小偏移,避免采样到纹理边缘 float2 uv = IN.texcoord; uv += 0.001 / _MainTex_TexelSize.xy; fixed4 c = tex2D(_MainTex, uv) * IN.color; c.rgb *= c.a; return c; } - 若自定义Shader,确保UV采样时使用
tex2Dlod替代普通tex2D,严格控制采样精度
内容的提问来源于stack exchange,提问作者Иван
相关产品推荐
相关产品推荐

