Unity解决z冲突(Z-Fighting)的几种方式

1、在物理上将对象移得更远
在大多数情况下,只需增加战斗对象之间的距离就可以解决深度冲突问题。这是最明显的解决方案,但遗憾的是,根据具体情况,并不总是可能的,但如果是的话,那么总是尝试增加对象之间的距离,如果这样做没有任何缺点!Unity Z-Fight 示例。
2、增加相机的*剪裁*面并减少远剪裁*面。相机
剪裁*面的范围越小,深度缓冲精度就不会被浪费。在运行时更改这些值也可能是值得的,例如在通过双筒望远镜观察时增加远剪裁*面和*剪裁*面。
 3、微移着色器深度偏移以强制将对象渲染在顶部
有时您可能希望一个对象位于另一个对象内,但仍希望将一个对象强制渲染在顶部。(例如墙壁上的涂鸦、地面上的污垢等)在这些情况下您可以调整着色器偏移。这将在不物理移动顶点的情况下偏移渲染对象的渲染。  
Offset需要2个参数;相加以计算深度偏移的因子和单位。
– 因子参数随着屏幕空间中对象的斜率而变化,这意味着从某个角度查看对象时您会看到偏移量受到影响。
– 单位参数随最小可解析深度缓冲区值缩放,这意味着随着深度缓冲区变得不太精确,该值将增加,以防止深度冲突。
使用负偏移值将渲染拉*相机,例如“Offset -1 -1”将以一定角度或直接在深度缓冲区精度要求严格的位置将偏移拉*。(请注意,某些较旧的移动设备可能会忽略因子偏移参数,因此在这些情况下,您可能只能依靠设置更大的单位值!)
4、真正强制一个对象始终渲染在顶部
您可能只想强制某些对象始终位于其他所有对象之上。在这些情况下,您应该在着色器内将 ZTest 属性设置为 Off,这将使其忽略相机深度,而只是根据渲染队列顺序进行渲染。(渲染队列可以在着色器中设置,也可以直接从材质上的渲染队列属性设置。

参考:

1、https://docs.unity3d.com/cn/current/Manual/SL-Offset.html

2、https://www.unity3dtips.com/zh/unity-z-fighting-solutions/

posted on 2024-03-21 18:02  Jason_c  阅读(494)  评论(0编辑  收藏  举报