关于unity渲染顺序的远近判断的疑问与研究
这一切的起因都是因为一个现象。

如图,我这里本来有个关闭深度写入的白色面片,现在场景是这样(地板,人物,面片都是在不透明物体队列即2000队列内)。我的理解是先渲染了地板,然后写入深度,然后渲染面片,不写入深度,然后渲染人物写入深度,最后的队列渲染了天空球,覆盖掉白色面片溢出地板的部分。

但是镜头稍微拉远些,就会变成图里这样,我的理解是先渲染了白色面片,然后再渲染地板,然后再渲染了人物,最后在后面队列渲染了天空球。所以白色面片全被挡住了。
然后我在framedebug里面看了下,发现我的想法是对的,就是随着距离的移动,一下子是先渲染面片,一下子是先渲染地板,但是我不懂这是什么原因导致的。

之后我感觉这个现象很可能跟unity相同渲染队列内判断物体远近的方式有关。我们知道相同队列内的不透明物体,unity是按照由近到远的方式绘制的。(这里要注意区分逐物体绘制和逐片元绘制的区别,它是先确定绘制一个物体后,再对物体进行逐片元绘制,图中的问题就是因为物体绘制顺序导致的)应该是有什么原因,导致了它在正面情况下计算物体和摄像机距离的时候出错了。而且这个算法应该不是单纯的物体坐标和摄像机坐标的distance。不然不会出现正面拉远闪烁,侧面拉远就不闪烁的问题。

https://zhuanlan.zhihu.com/p/473875401
https://qxsoftware.github.io/Unity-Rendering-Order.html
这两个网址都提到了unity绘制不透明物体顺序的算法是什么,然后我去官方文档看了说明。

它的确是用了一种别致的算法来确定远近。但是我想找源码来看,找了半天都找不到。
个人目前结论,低贱的油腻体不知道用的什么天才算法导致了这个物体远近距离的判断会有bug。当然,这个情况其实是极端情况。我只需要把面片渲染队列+1,就可以完美解决这个问题,这也是模板测试mask常用的操作。但这个bug还是很颠。