Unity ZTest深度测试 & ZWrite深度写入
Shader深度渲染队列Queue预定义值:Background(1000)、Geometry(2000)、AlphaTest(2450)、Transparent(3000)、Overlay(4000)。
渲染优先顺序: Queue值越小越先渲染,后渲染的物体会覆盖先渲染的物体。
测试:我想让远处的红色方块遮挡住近处的蓝色方块,即让蓝色的先渲染,红色的后渲染,我将红块的Queue设置为Transparent ,蓝块的Queue值设置为Transparent -1,按照上面的渲染优先顺序,值越小越先渲染,按道理红块后渲染应该覆盖在蓝块前面对吧,结果却不是这样的,蓝块依旧在红块前面。
这是为什么呢?原因在下面两条指令,shader代码中虽然没有定义,但是默认存在的。
ZTest:深度测试。(LEqua小于等于、Less小于、Greater大于、Equal等于 , NotEqual不等于)
ZWrite:深度写入。(On打开、Off关闭)。
系统中存在一个颜色缓冲区和一个深度缓冲区,分别存储颜色值和深度值,来决定画面上应该显示什么颜色。深度值是物体在世界空间中距离摄像机的远近,距离越近深度值越小,反之越大。
上面的测试中,蓝色方块比红色方块近,那么蓝色方块的深度值就比红色方块小。假设蓝块的深度值为1,红块深度值为2,例子中蓝块优先渲染,系统就先将蓝色值存入颜色缓冲区,将深度值1存入了深度缓冲区。
接下来渲染红块,系统会将红块的深度值和缓冲区的深度值对比(这个过程就是深度测试),由于ZTest的深度测试方式是Lequal小于等于,即深度值小于1才会通过测试,如果通过了测试,且ZWrite处于On状态,
该颜色的深度值就会替换深度缓冲区中的值,颜色值也会替换颜色缓冲区中的值,从而显示新的颜色。很显然,2 > 1,深度测试并不能通过,红色也就不能显示在蓝色的前面。
如果我们硬要远处的红块遮挡近处的蓝块,很显然,我们应该关闭深度写入ZWrite或者关闭深入测试ZTest,能得到我们想要的结果,如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】