UGUI添加半透明3d模型層級(jí)錯(cuò)亂問(wèn)題

本次研究需要達(dá)到的目的,3d模型能夠正確參與UGUI排序,不會(huì)造成層級(jí)錯(cuò)亂。
前提:3d物體在Transparent層渲染,ZTest LEqual,ZWrite On,Blend SrcAlpha OneMinusSrcAlpha。


image.png

設(shè)想一:
在UGUI中穿插半透明模型,最先想到的就是通過(guò)Z排序,當(dāng)我們半透明物體Z比UGUI背景Z小則在它上面,比其Z大則在它前面,于是收起我們調(diào)節(jié)Z軸:


image.png

事與愿違,我們發(fā)現(xiàn)3D物體并沒(méi)有成功與背景顏色混合,打開(kāi)FrameDebuger查看原因:


image.png

從圖上我們可以看出3D模型在UGUI之前進(jìn)行渲染,因?yàn)殚_(kāi)啟了ZWrite,于是在UGUI渲染的時(shí)候,ZTest失敗,所以不會(huì)有UGUI參與混合。所以我們需要解決的是3D模型在背景渲染完成之后再進(jìn)行渲染,于是想到了Canvas上的Order in Layer控制。我再Unity2018上面發(fā)現(xiàn),只要Order in Layer小于0,則UGUI會(huì)在3d物體之前渲染,這里物體默認(rèn)的Layer就是0,可以通過(guò)render.sortingOrder進(jìn)行設(shè)置。
設(shè)想二:
設(shè)置背景Order in Layer值小于0


image.png

image.png

這里我們可以看出和背景層級(jí)正確,渲染順序也正確那我們?cè)倮^續(xù)插入前景,根據(jù)上面的結(jié)論,我們只要前景的Order in Layer設(shè)置大于0就行了,那么我們看:


image.png

image.png

這里渲染順序正確的,但是為什么前景還是被模型給擋住了呢,并且沒(méi)有混合,所以這里應(yīng)該是ZWrite的問(wèn)題,前景的ZTest測(cè)試失敗,查看后發(fā)現(xiàn)果然是前景的Z比透明模型的Z大,所以造成了這樣的結(jié)果,重現(xiàn)調(diào)節(jié)Z軸,最后得到效果


image.png

結(jié)論:Order in Layer可以控制3D模型與UGUI的渲染順序,只需要背景的layer小于0,前景l(fā)ayer大于0,而Z軸影響晚于3D模型渲染ui(也就是Layer大于0的ui)的ZTest,所以我們前景的UI的Z軸一定要小于模型的Z軸

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容