Unity3D中的Z-fithgting问题

本文详细介绍了Unity3D中Z-fighting现象,即多个对象渲染时的闪烁问题,及其解决方案。通过调整相机的近远剪裁平面、修改Shader深度偏移设置,以及利用InstanceID设置不同物体的渲染顺序,可以有效解决此问题。同时,文章提供了一种针对相同材质物体的优化方法,通过C#代码动态改变材质属性,避免Z-fighting。
摘要由CSDN通过智能技术生成

Unity3D中的Z-fithgting问题

一、什么是Z-fighting

  • 多个对象争夺最接近相机的渲染(争夺顶部)。当对象由于在渲染场景时具有相似的z-buffer值而重叠时,可能会发生这种情况。

  • 简单的讲,就是多个平面共面,导致的他们之间相互“打架”,都想让相机先看到自己而产生闪烁,如下图:

  • 正常的渲染应如下图:

二、如何解决Z-fighting

1. 在物理上将对象移得更远
  • 不推荐,视觉效果差,而且实际工程中也不允许对象的位置发生偏移。
2. 增加相机的近剪裁平面并减少相机的远剪裁平面
  • 调整主相机的Clipping Planes中的Near与Far属性
3. 修改Shader深度偏移设置不同对象的渲染顺序
  • 在shader中添加Offset <factor>, <units>

三、示例——基于方法3

  • 新建shader脚本:Create->Shader->Stander Surface Shader

  • 打开脚本

  • Properties中添加

      Properties
      {
      	_OffsetFactor("Offset Factor", Float) = 0
      	_OffsetUnits("Offset Units", Float) = 0
      }
    
  • SubShader中添加

      SubShader
      {
          Offset[_OffsetFactor],[_OffsetUnits]
      }
    
  • 将shader拖拽到材质球中,点击材质球,在inspector中可以看到Offset FactorOffset Units属性

  • Offset FactorOffset Units官方介绍中取值为[-1, 1],笔者实际操作发现-2、-3等数值,也可以使用

  • 为不同材质球设置不同的Offset FactorOffset Units,即可解决Z-fighting问题

四、相同材质物体的Z-fighting问题

  • 如果发生Z-fighting的物体材质相同,则还需进一步的优化:

  • 思路:不同的物体设置不同的Offset FactorOffset Units

  • 核心:获取对象InstanceID,通过C#代码改变物体材质

  • 代码如下:

    GameObject obj = new GameObject();
    // 获取独一无二的InstanceID
    int instanceID = obj.GetInstanceID();
    // 获取材质
    Material _material = obj.GetComponent<MeshRenderer>().material;
    // 设置材质属性_OffsetFactor与_OffsetUnits
    _material.SetFloat("_OffsetFactor", instanceID * 0.00002f);
    _material.SetFloat("_OffsetUnits", instanceID * 0.00002f);
    
  • 优化前:

  • 优化后:

五、reference

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值