Unity-Shader-渲染队列,ZTest,ZWrite

Unity-Shader-渲染队列,ZTest,ZWrite

  • ZTest(深度测试)和ZWrite(深度写入)
    • ZTest Less(深度小于当前缓存则通过)
    • ZTest Greater(深度大于当前缓存则通过)
    • ZTest LEqual(深度小于等于当前缓存则通过)
    • ZTest GEqual (深度大于等于当前缓存则通过)
    • ZTest Equal (深度等于当前缓存则通过)
    • ZTest NotEqual(深度不等于当前缓存则通过)
    • ZTest Always(不论如何都通过)
    • 注意,ZTest Off等同于ZTest Always,关闭深度测试等于完全通过。
    • 方法一:让绿色的对象不被前面的立方体遮挡,一种方式是关闭前面的蓝色立方体深度写入:
    • 方法二:另一种方式是让绿色强制通过深度测试:
    • 那么如果红色的也开了ZTest Always会怎么样?
    • 再看一下Greater相关的部分有什么作用,这次我们其他的都是用默认的渲染状态,绿色的立方体shader中ZTest设置为Greater:
    • 有一个好玩的效果其实就可以考ZTest Greater来实现,就是游戏里面经常出现的,当玩家被其他场景对象遮挡时,遮挡的部分会呈现出X-光的效果;其实是在渲染玩家时,增加了一个Pass,默认的Pass正常渲染,而增加的一个Pass就使用Greater进行深度测试,这样,当玩家被其他部分遮挡时,遮挡的部分才会显示出来,用一个描边的效果渲染,其他部分仍然使用原来的Pass即可。

ZTest(深度测试)和ZWrite(深度写入)

之前一篇渲染队列的例子中,虽然渲染的顺序反了过来,但是物体之间的遮挡关系仍然是正确的,这就是z-buffer的功劳,不论我们的渲染顺序怎样,遮挡关系仍然能够保持正确。而我们对z-buffer的调用就是通过ZTest和ZWrite来实现的。

首先看一下ZTest,ZTest即深度测试,所谓测试,就是针对当前对象在屏幕上(更准确的说是framebuffer)对应的像素点,将对象自身的深度值与当前该像素点缓存的深度值进行比较,如果通过了,本对象在该像素点才会将颜色写入颜色缓冲区,否则不会写入颜色缓冲。ZTest提供的状态较多。

ZTest Less(深度小于当前缓存则通过)

ZTest Greater(深度大于当前缓存则通过)

ZTest LEqual(深度小于等于当前缓存则通过)

ZTest GEqual (深度大于等于当前缓存则通过)

ZTest Equal (深度等于当前缓存则通过)

ZTest NotEqual(深度不等于当前缓存则通过)

ZTest Always(不论如何都通过)

注意,ZTest Off等同于ZTest Always,关闭深度测试等于完全通过。

下面再看一下ZWrite,ZWrite比较简单,只有两种状态,ZWrite On(开启深度写入)和ZWrite Off(关闭深度写入)。当我们开启深度写入的时候,物体被渲染是针对物体在屏幕(更准确的说是frame buffer)上每个像素的深度都写入到深度缓冲区;反之,如果是ZWrite Off,name物体的深度就不会写入深度缓冲区。但是,物体是否会写入深度,除了ZWrite这个状态之外,更重要的是需要深度则是通过,也就是说ZTest通过,如果ZTest都没通过,那么也就不会写入深度了。就好比默认的渲染状态是ZWrite On和ZTest LEqual,如果当前深度测试失败,说明这个像素对应的位置,已经有一个更靠前的东西占坑了,即使写入了,也没有原来的更靠前,那么也就没有必要再去写入深度了。所以上面的ZTest分为通过和不通过两种情况,ZWrite分为开启和关闭两种情况的话,一共四种情况:
1.深度测试通过,深度写入开启;写入深度缓冲区,写入颜色缓冲区;
2.深度测试通过,深度写入关闭;不写入深度缓冲区,写入颜色缓冲区;
3.深度测试不通过,深度写入开启;不写入深度缓冲区,不写入颜色缓冲区;
4.深度测试不通过,深度写入关闭;不写入深度缓冲区,不写入颜色缓冲区;
在这里插入图片描述
写几个简单的小例子来看一下ZTest,ZWrite以及Render Queue这几个状态对渲染结果的控制。

方法一:让绿色的对象不被前面的立方体遮挡,一种方式是关闭前面的蓝色立方体深度写入:

在这里插入图片描述
通过上面的实验结果,我们知道,按照从前到后的渲染顺序,首先渲染蓝色物体,蓝色物体深度测试通过,颜色写入缓存,但是关闭了深度写入,蓝色部分的深度缓存值仍然是默认的Max,后面渲染的绿色立方体,进行深度测试仍然会成功,写入颜色缓存,并且写入了深度,因此蓝色立方体没有起到遮挡的作用。

方法二:另一种方式是让绿色强制通过深度测试:

在这里插入图片描述
这个例子中其他立方体的shader使用默认的渲染方式,绿色的将ZTest设置为Always,也就是说不管怎样,深度测试都通过,将绿色立方体的颜色写入缓存,如果没有其他覆盖了,那么最终的输出就是绿色的了。

那么如果红色的也开了ZTest Always会怎么样?

在这里插入图片描述
在红色立方体也用了ZTest Always后,红色遮挡了绿色的部分显示为了红色。如果我们换一下渲染队列,让绿色在红色之前渲染,结果就又不一样了:
在这里插入图片描述
更换了渲染队列,让绿色的渲染队列+1,在默认队列Geometry之后渲染,最终重叠部分又变回了绿色。可见,当ZTest都通过时,上一个写入颜色缓存的会覆盖上一个,也就是说最终输出的是最后一个渲染的对象颜色。

再看一下Greater相关的部分有什么作用,这次我们其他的都是用默认的渲染状态,绿色的立方体shader中ZTest设置为Greater:

这个效果就比较好玩了,虽然我们发现在比较深度时,前面被蓝色立方体遮挡的部分,绿色的最终覆盖了蓝色,是想要的结果,不过其他部分哪里去了呢?简单分析一下,渲染顺序是从前到后,也就是说蓝色最先渲染,默认深度为Max,蓝色立方体的深度满足LEqual条件,就写入了深度缓存,然后绿色开始渲染,重叠的部分的深度缓存是蓝色立方体写入的,而绿色的深度值满足大于蓝色深度的条件,所以深度测试通过,重叠部分颜色更新为绿色;而与红色立方体重合的部分,红色立方体最后渲染,与前面的部分进行深度测试,小于前面的部分,深度测试失败,重叠部分不会更新为红色,所以重叠部分最终为绿色。而绿色立方体没有与其他部分重合的地方为什么消失了呢?其实是因为绿色立方体渲染时,除了蓝色立方体渲染的地方是有深度信息的,其他部分的深度信息都为Max,蓝色部分用Greater进行判断,肯定会失败,也就不会有颜色更新。

有一个好玩的效果其实就可以考ZTest Greater来实现,就是游戏里面经常出现的,当玩家被其他场景对象遮挡时,遮挡的部分会呈现出X-光的效果;其实是在渲染玩家时,增加了一个Pass,默认的Pass正常渲染,而增加的一个Pass就使用Greater进行深度测试,这样,当玩家被其他部分遮挡时,遮挡的部分才会显示出来,用一个描边的效果渲染,其他部分仍然使用原来的Pass即可。

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

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

相关文章

如何做好职业规划(乾卦)

职业一般来说会占用我们每个人生命中的大部分时间,而职业发展中变化莫测的因数常常令我们束手无策、捉襟见肘。在面对变化多端的情况时,中国人的传统智慧就发挥出最大的优势了。如何将快速变化 、不好掌控的事情处理得井井有条,这需要我们懂得…

850是什么意思_沃尔沃为什么不是一线豪华品牌?

1927年诞生的沃尔沃,它造车的历史比宝马还要略早几年。但经过近百年的发展,宝马品牌无论在国际上还是我们国内,以销量还是品牌含金量来看,都是众所公认的豪华品牌第一阵营成员(奔驰、宝马,奥迪)…

【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API

ABP提供Script Proxy WebApi为所有的Dynamic WebApi生成访问这些WebApi的JQuery代理,AngularJs代理以及TypeScriptor代理。这些个代理就是javascript脚本,通过这些代理可以简单的访问Dynamic webApi。 如下实例演示一个最基本的应用场景。首先通过Script Proxy Web…

word2003如何设置护眼模式_手机屏幕的护眼模式是如何保护你的眼睛?

公司业务包括:二手机回收,二手机销售,配件批发,以及手机维修等业务,目前公司业务覆盖山西全境以及周边省市,在同行业有较高知名度。 随着智能手机的普及,大多数人也逐渐开始沉迷于每天的刷手…

WinCE系统的编译过程

作者:ARM-WinCE 在WinCE系统中,当我们完成了相关的开发和系统定制工作以后,会编译WinCE系统,最后生成NK.bin和NK.nb0。我现在用WinCE6.0在自己的PC上面编译一次用时19分16秒(有一天无聊,就测了一下)。下面介绍一下WinC…

【转】ABP源码分析三十八: ABP.Web.Api.OData

如果对OData不熟悉的话可参考OData的初步认识一文以获取OData的一些初步知识。 API.Odata 模块唯一用处就是提供了一个泛型版本的ODataController&#xff0c;实现了Controller代码的常用。 AbpODataEntityController<TEntity, TPrimaryKey>&#xff1a;使用ABP的repos…

饭卡可以用水冲洗吗_薄壁不锈钢水管真的可以满足大众用水健康管道的要求吗?...

我们都认识现如今的自来水的出厂干净程度达到安全、卫生&#xff0c;干净标准。但是&#xff0c;很是收到不少市民的投诉&#xff0c;说日常饮用的自来水有异味、浑浊、杂质&#xff0c;为何会出现这番现象呢&#xff0c;为此&#xff0c;我国也针对此研究调查&#xff0c;最后…

WinCE的快速启动

PXA270上的双启动功能已经实现了&#xff0c;但又引入了一个新问题&#xff0c;WinCE的启动太慢&#xff0c;大概需要2分钟&#xff01;这显然是不能忍受的。通过两天的努力&#xff0c;现在已经缩短到20秒&#xff0c;虽然还是有点长&#xff0c;但已改善不少了。先整理一下&a…

【转】ABP源码分析三十九:ABP.Hangfire

ABP对HangFire的集成主要是通过实现IBackgroundJobManager接口的HangfireBackgroundJobManager类完成的。 HangfireBackgroundJobManager:实现了接口IBackgroundJobManager中的方法EnqueueAsync&#xff0c;通过HangfireBackgroundJob完成Enqueue。重写了BackgroundWorkerBase…

计算机无法显示硬盘盘符,电脑硬盘不显示盘符怎么办 移动硬盘不显示盘符的原因...

电脑上是目前我们经常会使用到电子设备&#xff0c;其中电脑硬盘是电脑重要的零部件&#xff0c;它可以为电脑存储和运行各种文件&#xff0c;是电脑不可或缺的组件&#xff0c;然后用户在使用电脑的时候突然发现电脑硬盘不显示盘符该怎么办&#xff0c;移动硬盘显不示盘符的有…

百度云cdn设置州五年制大专_图说云原生:让云原生转型变得像种白菜一样简单...

序有一天&#xff0c;女朋友突然问我&#xff1a;“能不能跟我讲讲&#xff0c;你每天在开发的这些“天合”云原生平台、容器引擎、微服务&#xff0c;都是做什么的呀&#xff1f;”我说&#xff1a;“可以啊。简单来讲&#xff0c;我们的产品就是帮助客户实现云原生应用的上云…

【转】ABP源码分析四十:ZERO的Application和Tenant

ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, session, authorization (permission management), setting management, language management, audit logging等核心功能。ABP中的这些功能具体实现都依…

allegro标注尺寸设置_标注新升级 | SOLIDWORKS 2020新功能揭秘

在实际设计过程中&#xff0c;尺寸链在工程图尺寸标注中使用率是非常高的。尺寸链是由互相联系的尺寸按一定顺序&#xff0c;首尾相接排列而成的封闭尺寸组。常规设置方法在SOLIDWORKS之前的版本中&#xff0c;我们可以使用&#xff1a;基准尺寸、尺寸链(水平&竖直尺寸链)完…

如何选购计算机主板电池,电脑主板电池耗电太快什么原因?如何判断问题并解决?...

一般来说&#xff0c;主板其实并不是非常容易损坏的&#xff0c;但用的时间长了也会出现些小问题&#xff0c;下面小编为大家介绍电脑主板电池耗电太快什么原因&#xff1f;如何判断问题并解决&#xff1f;电脑主板电池耗电太快什么原因CMOS电池耗电太快&#xff0c;有可能是主…

【转】ABP源码分析四十一:ZERO的Audit,Setting,Background Job

AuditLog: 继承自Entity<long>的实体类。封装AuditLog的信息。 AuditingStore: 实现了IAuditingStore接口&#xff0c;实现了将AuditLog的信息保存到数据库的功能。其通过IRepository<AuditLog, long>实例完成对数据库的操作。 BackgroundJobStore : 实现了IBack…

翻译记忆软件:Trados 7/2006,兼容性和基本用法讨论

兼容性 我下载了Trados7&#xff0c;但是发现和Word2003和Word2007均没有加载出来&#xff0c;不能工作。 后来下载Trados2006&#xff08;7.5&#xff09;&#xff0c;安装之后&#xff0c;发现可以在Word2003下使用了&#xff0c;在Word2007下虽然加载项能够出来&#xff0c…

【转】ABP源码分析四十二:ZERO的身份认证

ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展。同时重写了ABP核心模块中的permission功能&#xff0c;以实现授权。注意&#xff1a;ABP仅仅使用了Asp.Net Identity的身份认证功能&#xff0c;但没有使用Asp.Net Identi…

搜索计算机硬盘的索引恢复,可以做到秒搜的神器everything,你可知对硬盘到底有多大伤害...

相比较Windows系统自带的搜索功能&#xff0c;everything堪称搜索界的神器&#xff0c;尤其在电脑里文件多达数万数十万的恐怖数量&#xff0c;但everything仍可做到秒搜&#xff0c;所以这款软件为大部分办公人员所喜爱。说到everything对硬盘的伤害程度&#xff0c;我们先看看…

【转】ABP源码分析四十四:ZERO的配置

ABP Zero模块中需要配置的地方主要集中在三块&#xff1a;1.配置静态的role&#xff1b;2.配置外部认证源&#xff1b;3.配置本地化语言和资源。 UserManagementConfig/IUserManagementConfig:定义了一个配置项&#xff0c;用于配置外部认证源。默认情况下&#xff0c;ABP Zero…

在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)

项目涉及到多个数据库的查询更新操作&#xff0c;也就必然需要分布式事务的支持&#xff0c;查了MSDN知道 .net 2.0 中利用新增的 System.Transactions 命名空间可以简单的实现分布式事务&#xff1a; System.Transactions 基础结构通过支持在 SQL Server、ADO.NET、MSMQ 和 Mi…