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,能得到我们想要的结果,如下:

 

posted @   Mr. Ant  阅读(6208)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示