Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案

1.ZTest & ZWrite

ZTest:深度测试,开启后测试结果决定片元是否被舍弃,可配置 
ZWrite:深度写入,开启后决定片元的深度值是否写入深度缓冲,可配置

ZTest可设置的测试规则:

ZTest Less:深度小于当前缓存则通过
ZTest Greater:深度大于当前缓存则通过
ZTest LEqual:深度小于等于当前缓存则通过
ZTest GEqual:深度大于等于当前缓存则通过
ZTest Equal:深度等于当前缓存则通过
ZTest NotEqual:深度不等于当前缓存则通过
ZTest Always:不论如何都通过
注意,ZTest Off等同于ZTest Always,关闭深度测试等于完全通过。

ZWrite配置: 
ZWrite On 深度写入开启 ZWrite Off 深度写入关闭

ZTest和ZWrite发生在逐片元操作过程,处于片元着色后,最终屏幕输出前。ZTest与ZWrite的具体操作流程:

因为ZWrite默认值为On,ZTest默认值为LEqual,所以这很好地解释了为什么在unity中,距离相机近的东西会阻挡住距离相机远的东西。如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这时我们可以通过修改ZWrite和ZTest来改变物体的遮挡关系

所以对于透明物体的渲染,一般要关闭掉ZWrite,比如Unity中用于渲染Sprite的默认SpriteDefault材质的Shader:

加深对ZTest & ZWrite的理解,可以参考这篇文章的测试部分,把各例子理解明白非常有帮助。

https://www.jianshu.com/p/9137ee354dbd

2.Unity渲染顺序

能够影响渲染顺序的因素有:

  • Camera Depth:    相机组件上设置的相机深度,深度越大越靠后渲染。
  • Sorting Layer:     在Tags & Layers设置中可见
  • Order In Layer:    相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。
  • RenderQueue:     Shader中对Tags设置的“Queue”。
  • 物体距离相机的距离,ZDepth值

下面是结果:
1、Camera Depth
永远最高。Camera Depth小的一定先进渲染管线。

2、当Sorting Layer和Order In Layer不相同时

  • 当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序生效。
  •  当两个材质使用了不同的RenderQueue,且这两个RenderQueue分别在[0~2500]和[2501~5000]时,则一定会按照RenderQueue绘制,无视SortingLayer、OrderInLayer的排序。

3、当Sorting Layer和Order In Layer相同时

  • RenderQueue不相等:

        RenderQueue小的先进渲染管线。

  •  RenderQueue 相等

        RenderQueue 2500以下,由近到远排序优先 (不透明)

        RenderQueue 2500以上, 由远到近排序优先  (透明)

说明一下:2500是关键值,它是透明跟不透明的分界点,因此我们考虑层级的时候要注意着点:renderqueue > 2500的物体绝对会在renderqueue <= 2500的物体前面,即渲染时renderqueue大的会挡住renderqueue小的,不论它的sortingLayer和sortingOrder怎么设置都是不起作用的。知道了这点,其他的就很好理解了。当两个的RenderQueue都在同一侧时,在SortingLayer高的绝对会在sortingLayer前面,无视renderqueue跟soringOrder,只有在sortingLayer相同的前提下,soringOrder高的会在sortingOrder低的前面,无视renderqueue。当sortingLayer跟sortingOrder相同时,才看renderqueue的高低,高的在前面。

总结下Unity影响渲染顺序各参数的优先级

如果物体的RenderQueue在2500的同一侧:

Camera DepthSorting Layer > Order In Layer > RenderQueue > 距离相机的距离

如果物体的RenderQueue在2500的不同侧:

Camera DepthRenderQueue > Sorting Layer > Order In Layer > 距离相机的距离

3.Unity中的一个坑

PropertiesValue渲染队列描述说明
Background1000This render queue is rendered before any others.这个队列通常被最先渲染(比如 天空盒)。
Geometry2000Opaque geometry uses this queue.这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。
AlphaTest2450Alpha tested geometry uses this queue.需要开启透明度测试的物体。Unity5以后从Geometry队列中拆出来,因为在所有不透明物体渲染完之后再渲染会比较高效。
GeometryLast2500Last render queue that is considered “opaque”.所有Geometry和AlphaTest队列的物体渲染完后
Transparent3000This render queue is rendered after Geometry and AlphaTest, in back-to-front order.所有Geometry和AlphaTest队列的物体渲染完后,再按照从后往前的顺序进行渲染,任何使用了透明度混合的物体都应该使用该队列(例如玻璃和粒子效果)
Overlay4000This render queue is meant for overlay effects.该队列用于实现一些叠加效果,适合最后渲染的物体(如镜头光晕)。

从Unity文档中这个图我们可以看出来,Background理应最先被渲染,Unity中的skybox 应该属于这个renderqueue,但是当你实际使用的时候,怪事发生了:

从FrameDebugger中可以看到,对于不透明物体的渲染,skybox是在opaque的最后渲染,从而减少OverDraw。这尼玛不跟RenderQueue写的1000冲突么?!Google一顿操作,结果是这样:

 

 

总结来说就是:Unity关于Skybox部分的文档好久没有更新了,目前Skybox应该是RenderQueue 值为2500.5时渲染,在Opaque和AlphaTest之后,Transparent之前。

Unity这个文档证明了这个说法:https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html?_ga=2.53580588.563516390.1589165101-117244140.1588818896

 

4. 2.5D游戏渲染排序解决方案

上边总结了Unity中渲染顺序的相关知识,那利用这些知识,可以实现2D游戏中景深以及排序的问题,初步总结了几种方案:

1.Order In Layer 

通过设置Order In Layer 为不同的值来进行排序,缺点是需要自定义一套标准来决定物体的Order In Layer值 

下边这个插件用的是这个原理

https://assetstore.unity.com/packages/tools/sprite-management/isometric-toolkit-33032

2.用Shader自定义修改ZDepth

通过自己设置Shader中的ZDepth来达到排序的目的,也就是说Sprite在场景中的Z值都一样,通过制定一套标准,来人为定义物体的ZDepth值 

下边这个插件用的是这个原理

https://assetstore.unity.com/packages/templates/systems/2-5d-isometric-engine-106321

3.利用Z轴,实际就是ZDepth

在场景中把各个Sprite摆放位置根据前后关系设置Z轴位置,这样2D游戏也可以拥有ZDepth的信息,从而可以正确渲染 

4.修改UnityProject 的设置

 改为Y轴为排序轴,这种方法不用考虑Z轴,完全根据Sprite的y轴大小设置,非常简便。我是用的这种方式,暂时的缺点是无法根据sprite大小精确控制排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 235. 二叉搜索树的最近公共祖先

题解 官方的题解就很清晰 https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/solution/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian--2/ 方法一&#xff1a;递归 public class Solution {public TreeNode LowestCommonAncestor(TreeN…

判断鼠标是否在元素上_能不能从大便上判断出一个人是否患有结肠癌?

通过大便的观察是可以怀疑是否得了结肠癌的&#xff0c;但并不是由于从大便上诊断患者得了癌症这个病。结肠癌症诊断金标准结肠癌的诊断的金标准做肠镜&#xff0c;通过肠镜进行观察&#xff0c;看是否有癌症。如果不明显&#xff0c;通过肉眼无法判断&#xff0c;一般要通过病…

LeetCode 240. 搜索二维矩阵

因为矩阵的行和列是排序的&#xff08;分别从左到右和从上到下&#xff09;&#xff0c;所以在查看任何特定值时&#xff0c;我们可以修剪O(m)O(m)或O(n)O(n)元素。 算法&#xff1a; 首先&#xff0c;我们初始化一个指向矩阵左下角的 (row&#xff0c;col)(row&#xff0c;co…

win10兼容模式怎么设置_win10护眼模式关不掉怎么办

win10系统是一款非常值得使用的优秀系统!强大的智能是win10系统最让人喜欢的地方&#xff0c;各种各样贴心的设置可以让用户们在使用电脑的过程中得到最好舒适体验&#xff0c;但是一些小伙伴们并不知道怎么才能设置好想要的设置&#xff0c;今天小编为大家带来的就是win10关闭…

Unity 2017 Game Optimization 读书笔记 Scripting Strategies Part 5

一. Disable unused scripts and objects 场景中激活的物体或者脚本越多&#xff0c;开销越大。对于很多并没有产生作用的脚本和物体&#xff0c;可以隐藏掉从而提升性能&#xff0c;比如FPS游戏中视野外的部分。 1.Disabling objects by visibility 有时我们希望脚本和物体…

代码实现sql编译器_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍

作者&#xff1a;Ti-Cool上周我们推送了《让数据库运行在浏览器里&#xff1f;TiDB WebAssembly 告诉你答案》&#xff0c;向大家展示了 TiDB-Wasm 的魅力&#xff1a;TiDB-Wasm 项目是 TiDB Hackathon 2019 中诞生的二等奖项目&#xff0c;实现了将 TiDB 编译成 Wasm 运行在浏…

C# int[,] 和 int[][]

原文链接&#xff1a;https://www.cnblogs.com/ILoveMyJob/p/9211102.html

java停车收费系统 源码开源_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统

每个Java程序员&#xff0c;从懵逼菜鸡&#xff0c;再到懵懂菜鸟&#xff0c;再到小鸟&#xff0c;大鸟&#xff0c;最后到技术大神&#xff0c;始终绕不开商城系统&#xff0c;里面蕴含了大量的业务&#xff0c;涉及到了大量的知识点和解决方案。今天介绍一款Java开源商城源码…

安卓ps2模拟器_安卓PSP模拟器评测:合金装备 和平步行者

哈喽&#xff0c;大家好&#xff0c;好久没有玩PSP模拟器了&#xff0c;昨晚下载了一款PSP游戏的3A大作&#xff0c;这款游戏名字叫做《合金装备 和平步行者》&#xff0c;这款游戏发售时间是&#xff1a;2010年4月29日。本作是真真正正由小岛秀夫亲自主刀开发的系统正统作品&a…

UnityEngine.UI.dll 路径

2019.2之后&#xff0c;路径已经从 Unity安装目录下的Editor\Data\UnityExtensions移动到了 package里&#xff0c;通过package编译后生成的dll在工程目录下的library里

c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下

线程池线程是宝贵的内存资源,单个线程占1MB空间,过多分配易造成内存溢出频繁的创建及销毁线程会增加虚拟机回收频率、资源开销、造成程序性能下降因此线程池出现了线程池的概念线程容器,可设定线程分配的数量上限将预先创建的线程对象存入池中,并重用线程池中的线程对象避免频繁…

此应用无法在你的电脑上运行_能直运行iOS应用!苹果新macOS翻车 正式版下载后无法安装...

原标题&#xff1a;能直运行iOS应用&#xff01;苹果新macOS翻车 正式版下载后无法安装 今天&#xff0c;苹果正式推出了macOS Big Sur正式版&#xff0c;其是苹果为Mac电脑设计的下一代操作系统&#xff0c;最大的变化是在性能上&#xff0c;因为Big Sur是第一个以苹果自研处理…

springcloud 整合 gateway_从Spring Cloud到Kubernetes的微服务迁移实践

写在前面要出发周边游&#xff08;以下简称要出发&#xff09;是国内知名的主打「周边游」的在线旅行网站&#xff0c;为了降低公司内部各个业务模块的耦合度&#xff0c;提高开发、交付及运维效率&#xff0c;我们在 2017 年就基于 Spring Cloud 完成了公司内部业务微服务化的…

leetcode 191. 位1的个数

经典题目&#xff0c;位操作的小技巧&#xff1a;与操作 我们可以把前面的算法进行优化。我们不再检查数字的每一个位&#xff0c;而是不断把数字最后一个 1 反转&#xff0c;并把答案加一。当数字变成 00 的时候偶&#xff0c;我们就知道它没有 1 的位了&#xff0c;此时返回…

程序员如何跟领导提离职_如何优雅地跟老板提加薪?按照这3个步骤来,也不是什么难事...

通常情况下&#xff0c;如果你在一个制度比较健全的单位上班&#xff0c;基本上不需要自己提出加薪的要求&#xff0c;达到规定的条件自然就涨工资了。但是我们绝大部分人&#xff0c;是在中小企业上班&#xff0c;如果不跟老板提加薪要求&#xff0c;老板很难主动给你涨工资。…

leetcode 打印从1到最大的n位数

书上原题本想考的是大数问题&#xff0c;但是leetcode上要求的返回值是int&#xff0c;不可能出现当n过大时大数越界的问题&#xff0c; 失去了本题的意义。按大数问题处理&#xff0c;用string和递归来处理该问题。 public class Solution {public int[] PrintNumbers(int n) …

强制关机对电脑的影响_电脑强制关机,对电脑有影响吗?你被伪科普骗了多久?...

相信大多数人都会遇到这么个情况&#xff0c;就是电脑用着用着死机、卡顿&#xff0c;在毫无反应又动弹不得的情况下&#xff0c;采用的招数就是长按电源键10秒强制关机重启。这时候身边的“电脑高手”就会告诉我们说&#xff0c;这样关机会毁害电脑硬件。但它却是处理电脑假死…

vb.net限制软件使用次数_新增投屏及倍数播放,这款软件iOSAndroid全都有,影视神器,抓紧体验...

小小影视 Android、iOS版小小影视以前也分享过&#xff0c;最近貌似版本更新了&#xff0c;新增投屏和倍数播放功能&#xff0c;还没用过的可以下载体验&#xff01;小小影视APP是一款最全&#xff0c;最新&#xff0c;关键不止有Android版&#xff0c;还有iOS版的影音播放软件…

leetcode 调整数组顺序使奇数位于偶数前面

解法一&#xff1a;双指针 public int[] Exchange(int[] nums) {int head 0;int tail nums.Length - 1;while(head < tail){if((nums[head] & 1) 1){head;continue;}else if((nums[tail] & 1) 0){tail--;continue;}else{int temp nums[head];nums[head] nums[…