关于unity渲染过程的疑惑

Unity渲染顺序与深度测试解析

我在测试渲染时发现一个问题:现在有2个不透明物体,A在前面,B在后面,A的深度测试为默认设置也就是LessEqual,B为Greater。那么这时谁会被渲染呢?
这个问题其实很好解决,找两个前后物体,设置深度测试后在unity直接看就能知道了:B可以被渲染,并且覆盖掉A的一部分。

疑惑1:为什么B可以渲染?两个设置看起来已经冲突了
答:虽然这样设置,两个物体深度测试都能通过,但是只有最后写入颜色缓冲区的片元才是能被渲染的,所以深度测试的顺序就很重要。
深度测试的顺序是由渲染队列决定的,不透明物体,同个渲染队列的情况,是从近到远执行的,所以深度测试时,近处的A先通过测试,写入缓冲区,之后B测试通过,再写入缓冲区,这时就把A覆盖掉了,所以是B会被渲染。

疑惑2:我可以理解成是因为A先渲染出来,之后B再渲染,把A的图片覆盖掉了对吗
答:不对!不能这么理解,因为unity不是这样渲染的。
在深度测试时B就已经把A的颜色缓冲区覆盖掉了,所以最后渲染的时候根本不会渲染A,只会渲染B。
同理,两个不透明物体深度测试设置成一样时,也是后面的物体会被渲染,这也是由于渲染队列决定的,从而使后面的B最后写入颜色缓冲区。

还有另一个疑惑:物体A和B,渲染流水线的顺序是怎么样的?是A走完完整的渲染流水线后再到B开始走渲染流水线;还是A走渲染流水线的时候B也同时开始走了?
答:A在执行渲染流水线的时候B也在同步执行,是并行执行的。但是细分时,像顶点着色器、片元着色器这些,都是A要先执行完,才会执行B,这样才不会乱。流水线的其他步骤也是这样:
深度缓冲区写入:A → B (顺序保证)
模板缓冲区写入:A → B (顺序保证)
颜色缓冲区写入:A → B (顺序保证)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值