问题

在Unity中绘制多个可能部分或全部重叠的物体,这些物体可能是使用同一个材质,此时大概率会产生Z-Fighting

解决思路

Z-Fighting的原因是片段计算出的深度值太接近了,从而不能确定哪一个离相机更近,互相竞争导致闪烁。那么解决思路就是让他们的Z值稍微有点区别。比较常见的解决方案是Polgon Offset,即Unity Shader Lab的Offset属性。但是对于使用同一个材质的物体,这个方法无效。因为这种物体互相重叠时即便在材质上设置了Offset,由于是同一个材质,计算出来的depth还是一样的,并不能区分开。那么怎么能区分开同一个物体的深度值呢?我想到了GPU Instancing绘制,每个物体有一个instance ID,使用这个ID就可以区分物体,从而进一步想办法区分深度值。但是材质的Offset并不能针对物体进行设置,好在有替代的方法,因为我们最终目标是偏移深度值,那么可以直接在计算深度值的时候进行偏移。我采用了修改clip space 坐标值的方法。

具体实现

注:我使用的开发环境是Unity2021+URP,内置流水线原理相同。

首先我们需要自定义shader,在Vertex Shader中直接偏移即可:

 #if UNITY_ANY_INSTANCING_ENABLEDvertexInput.positionCS += _ClipSpaceOffset * unity_InstanceID;#elsevertexInput.positionCS += _ClipSpaceOffset;#endif

借助于Instancing支持时的 unity_InstanceID,我们使用一个偏移值对clip space坐标进行偏移。
这儿的_ClipSpaceOffset定义为一个材质属性:

properties
{_ClipSpaceOffset("ClipsSpaceOffset", Float) = 0.0000002
}

需要注意的是,你的shader必须不兼容SRP Batcher,否则就无法启用GPU Instancing,在这儿由于我没有将_ClipSpaceOffset放到UnityPerMaterial的CBuffer中,因此自然就破坏了SRP Batcher。
最后打开材质的Enable GPU Instancing即可。

小问题

我发现这个方法使用之后,在Play Mode运行中,动态添加的物体可以正常稳定显示,无闪烁。但是在Unity的Scene View每次刷新,这些物体的顺序就会变一下,这有可能是Instance ID变化了。其实解决这个也很简单,使用MaterialProperty给每个物体绑定一个唯一ID,使用这个ID代替Instance ID即可。

参考

关于解决Z-Fighting,可参考Unity论坛的这个帖子

Unity解决同材质物体重叠产生Z-Fighting的问题相关推荐

  1. Unity中利用材质自发光实现物体闪烁效果

    Unity中利用材质自发光实现物体闪烁效果 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Project 窗口中将源材质的自发光 ...

  2. 小功能⭐️Unity中利用材质自发光实现物体闪烁效果

    文章目录 本文基于VDer的文章<Unity中利用材质自发光实现物体闪烁效果>延伸开发 在实现了具有一个Material的物体闪烁发光之后,延伸开发了具有多个Material的自闪烁效果, ...

  3. unity 里让一个物体围绕x,y,z轴旋转起来。

    如何 在unity 里让一个物体围绕x,y,z轴旋转起来? 先看下效果:  如何 在unity 里让一个物体围绕x轴旋转起来?答案揭晓: 实现代码: using System.Collections; ...

  4. Unity如何实现材质按照实际比例覆盖/延伸

    Unity如何实现材质按照实际比例覆盖/延伸 今天上司指派了一个新任务,要求材质按照实际比例覆盖上物体,即如果有一块10X10的玻璃,但是贴图是1X1,那么贴图则需要100份,如果贴图是10X10,那 ...

  5. Unity 3D 物理引擎简介 || Unity 3D 物理材质|| Unity 3D 力(AddForce)

    Unity 3D 物理引擎简介 早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏. 较为常见的物理处理是在跳 ...

  6. Unity 自动创建材质球工具

    一个新的模型导入Unity,所有的材质都是绑定的不能修改,想调材质就只能一个个的去创建再拖贴图,想搞个工具一键创建材质并且上好贴图.百度了一下,这玩意靠谱的也是没几个,自己写一个吧. 这个稍微靠谱点, ...

  7. Unity 模型导入材质丢失解决方案

    Unity 模型导入材质丢失解决方案 1.模型导入材质丢失解决方案 步骤如下: 1.打开材质球 2.,反射率和法线贴图分别赋值,即下面的两个物体对号入座 3.渲染成功 2.3d人物模型材质丢失 步骤如 ...

  8. unity地面添加材质球_unity自带材质球

    Unity5中重点推出了一套基于物理的着色(Physically Based Shading,PBS)的多功能Shader,叫做标准着色器(Standard Shader).这套Shader的设计初衷 ...

  9. Unity批量替换材质 URP项目

    Unity批量替换材质 URP项目 笔者此刻写文章的时候对Shader仅限于能看懂,以及Unity的shader和hlsl可以互相调用都是才了解,现在的需求是批量替换旧Shader至新Shader. ...

最新文章

  1. 《自卑与超越》读书笔记(part6)--职业有些时候成为了人们逃避爱情和社会问题的借口
  2. mysql语句中把string类型字段转datetime类型
  3. python爬取正确但不出文件_使用BeautifulSoup进行Python抓取时不显示所有行
  4. Linux日常运维管理技巧(四)文件同步工具-rsync、Linux系统日志、dmesg命令、lastb命令查看登录失败的用户、screen工具虚拟屏幕
  5. DBA的宿命(困兽之斗)
  6. SpringCloud——服务网关
  7. gg修改器修改数值没有用怎么办_gg修改器怎么用教学 gg修改器修改游戏方法介绍...
  8. 黑龙江测绘局事业单位2009拟聘人员公示
  9. 高手支招:免费拥有QQ魔法表情(转)
  10. 云计算的三种服务模式的讲解
  11. ArcGIS的符号选择器(Symbol Selector)为空的解决办法
  12. linux设备号——常见设备的主次设备号
  13. 模态对话框和非模态对话框的区别1
  14. day16re模块和面向对象
  15. 二手车进入新周期:谁会是下一个行业巨兽?
  16. Python中__dict__属性的详解(思维导图版)
  17. 由频谱重构时域信号:直观理解Griffin Lim算法
  18. 计算机音乐会议,ICMC2017国际计算机音乐会议亮相上海
  19. java除零异常_JAVA异常处理
  20. 如何选择消泡剂生产厂家?

热门文章

  1. Spring Boot 使用 Maven assembly 插件打包
  2. 全国计算机辅助技术岗位职责,计算机辅助普通话水平测试站岗位职责
  3. 山东大学软件工程应用与实践——Spark
  4. Java基础,保持编程设计风格,你也能成就大师风范
  5. 我们知道CDN护航了双11十年,却不知道背后有那么多故事……
  6. 自制面膜让你轻松美容 - 健康程序员,至尚生活!
  7. 剩余时间,倒计时毫秒时间戳转换为时间格式HH:mm:ss时间差计算
  8. 计算机系统组织结构,计算机系统的组织结构图
  9. 个人电子邮箱怎么填写正确?电子邮箱是怎么填写的?
  10. Redis主从复制和集群配置系列之四