關(guān)于unity渲染順序的遠(yuǎn)近判斷的疑問與研究
這一切的起因都是因?yàn)橐粋€現(xiàn)象。

如圖,我這里本來有個關(guān)閉深度寫入的白色面片,現(xiàn)在場景是這樣(地板,人物,面片都是在不透明物體隊列即2000隊列內(nèi))。我的理解是先渲染了地板,然后寫入深度,然后渲染面片,不寫入深度,然后渲染人物寫入深度,最后的隊列渲染了天空球,覆蓋掉白色面片溢出地板的部分。

但是鏡頭稍微拉遠(yuǎn)些,就會變成圖里這樣,我的理解是先渲染了白色面片,然后再渲染地板,然后再渲染了人物,最后在后面隊列渲染了天空球。所以白色面片全被擋住了。
然后我在framedebug里面看了下,發(fā)現(xiàn)我的想法是對的,就是隨著距離的移動,一下子是先渲染面片,一下子是先渲染地板,但是我不懂這是什么原因?qū)е碌摹?/p>
之后我感覺這個現(xiàn)象很可能跟unity相同渲染隊列內(nèi)判斷物體遠(yuǎn)近的方式有關(guān)。我們知道相同隊列內(nèi)的不透明物體,unity是按照由近到遠(yuǎn)的方式繪制的。(這里要注意區(qū)分逐物體繪制和逐片元繪制的區(qū)別,它是先確定繪制一個物體后,再對物體進(jìn)行逐片元繪制,圖中的問題就是因?yàn)槲矬w繪制順序?qū)е碌模?yīng)該是有什么原因,導(dǎo)致了它在正面情況下計算物體和攝像機(jī)距離的時候出錯了。而且這個算法應(yīng)該不是單純的物體坐標(biāo)和攝像機(jī)坐標(biāo)的distance。不然不會出現(xiàn)正面拉遠(yuǎn)閃爍,側(cè)面拉遠(yuǎn)就不閃爍的問題。

https://zhuanlan.zhihu.com/p/473875401
https://qxsoftware.github.io/Unity-Rendering-Order.html
這兩個網(wǎng)址都提到了unity繪制不透明物體順序的算法是什么,然后我去官方文檔看了說明。

它的確是用了一種別致的算法來確定遠(yuǎn)近。但是我想找源碼來看,找了半天都找不到。
個人目前結(jié)論,低賤的油膩體不知道用的什么天才算法導(dǎo)致了這個物體遠(yuǎn)近距離的判斷會有bug。當(dāng)然,這個情況其實(shí)是極端情況。我只需要把面片渲染隊列+1,就可以完美解決這個問題,這也是模板測試mask常用的操作。但這個bug還是很顛。