我在测试渲染时发现一个问题:现在有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 (顺序保证)
Unity渲染顺序与深度测试解析
2612

被折叠的 条评论
为什么被折叠?



