Unity解决同材质物体重叠产生Z-Fighting的问题
问题
在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的问题相关推荐
- Unity中利用材质自发光实现物体闪烁效果
Unity中利用材质自发光实现物体闪烁效果 补充:这种方法有一点问题,在测试(Windows平台)的时候发现,要想在Build出来的游戏中实现闪烁效果,就必须在 Project 窗口中将源材质的自发光 ...
- 小功能⭐️Unity中利用材质自发光实现物体闪烁效果
文章目录 本文基于VDer的文章<Unity中利用材质自发光实现物体闪烁效果>延伸开发 在实现了具有一个Material的物体闪烁发光之后,延伸开发了具有多个Material的自闪烁效果, ...
- unity 里让一个物体围绕x,y,z轴旋转起来。
如何 在unity 里让一个物体围绕x,y,z轴旋转起来? 先看下效果: 如何 在unity 里让一个物体围绕x轴旋转起来?答案揭晓: 实现代码: using System.Collections; ...
- Unity如何实现材质按照实际比例覆盖/延伸
Unity如何实现材质按照实际比例覆盖/延伸 今天上司指派了一个新任务,要求材质按照实际比例覆盖上物体,即如果有一块10X10的玻璃,但是贴图是1X1,那么贴图则需要100份,如果贴图是10X10,那 ...
- Unity 3D 物理引擎简介 || Unity 3D 物理材质|| Unity 3D 力(AddForce)
Unity 3D 物理引擎简介 早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏. 较为常见的物理处理是在跳 ...
- Unity 自动创建材质球工具
一个新的模型导入Unity,所有的材质都是绑定的不能修改,想调材质就只能一个个的去创建再拖贴图,想搞个工具一键创建材质并且上好贴图.百度了一下,这玩意靠谱的也是没几个,自己写一个吧. 这个稍微靠谱点, ...
- Unity 模型导入材质丢失解决方案
Unity 模型导入材质丢失解决方案 1.模型导入材质丢失解决方案 步骤如下: 1.打开材质球 2.,反射率和法线贴图分别赋值,即下面的两个物体对号入座 3.渲染成功 2.3d人物模型材质丢失 步骤如 ...
- unity地面添加材质球_unity自带材质球
Unity5中重点推出了一套基于物理的着色(Physically Based Shading,PBS)的多功能Shader,叫做标准着色器(Standard Shader).这套Shader的设计初衷 ...
- Unity批量替换材质 URP项目
Unity批量替换材质 URP项目 笔者此刻写文章的时候对Shader仅限于能看懂,以及Unity的shader和hlsl可以互相调用都是才了解,现在的需求是批量替换旧Shader至新Shader. ...
最新文章
- 《自卑与超越》读书笔记(part6)--职业有些时候成为了人们逃避爱情和社会问题的借口
- mysql语句中把string类型字段转datetime类型
- python爬取正确但不出文件_使用BeautifulSoup进行Python抓取时不显示所有行
- Linux日常运维管理技巧(四)文件同步工具-rsync、Linux系统日志、dmesg命令、lastb命令查看登录失败的用户、screen工具虚拟屏幕
- DBA的宿命(困兽之斗)
- SpringCloud——服务网关
- gg修改器修改数值没有用怎么办_gg修改器怎么用教学 gg修改器修改游戏方法介绍...
- 黑龙江测绘局事业单位2009拟聘人员公示
- 高手支招:免费拥有QQ魔法表情(转)
- 云计算的三种服务模式的讲解
- ArcGIS的符号选择器(Symbol Selector)为空的解决办法
- linux设备号——常见设备的主次设备号
- 模态对话框和非模态对话框的区别1
- day16re模块和面向对象
- 二手车进入新周期:谁会是下一个行业巨兽?
- Python中__dict__属性的详解(思维导图版)
- 由频谱重构时域信号:直观理解Griffin Lim算法
- 计算机音乐会议,ICMC2017国际计算机音乐会议亮相上海
- java除零异常_JAVA异常处理
- 如何选择消泡剂生产厂家?