本次研究需要達(dá)到的目的拔妥,3d模型能夠正確參與UGUI排序,不會(huì)造成層級(jí)錯(cuò)亂纵苛。
前提:3d物體在Transparent層渲染玉吁,ZTest LEqual,ZWrite On,Blend SrcAlpha OneMinusSrcAlpha照弥。
設(shè)想一:
在UGUI中穿插半透明模型,最先想到的就是通過(guò)Z排序进副,當(dāng)我們半透明物體Z比UGUI背景Z小則在它上面这揣,比其Z大則在它前面,于是收起我們調(diào)節(jié)Z軸:
事與愿違敢会,我們發(fā)現(xiàn)3D物體并沒(méi)有成功與背景顏色混合曾沈,打開(kāi)FrameDebuger查看原因:
從圖上我們可以看出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
這里我們可以看出和背景層級(jí)正確鼓蜒,渲染順序也正確那我們?cè)倮^續(xù)插入前景痹换,根據(jù)上面的結(jié)論,我們只要前景的Order in Layer設(shè)置大于0就行了都弹,那么我們看:
這里渲染順序正確的娇豫,但是為什么前景還是被模型給擋住了呢,并且沒(méi)有混合畅厢,所以這里應(yīng)該是ZWrite的問(wèn)題冯痢,前景的ZTest測(cè)試失敗,查看后發(fā)現(xiàn)果然是前景的Z比透明模型的Z大,所以造成了這樣的結(jié)果浦楣,重現(xiàn)調(diào)節(jié)Z軸袖肥,最后得到效果
結(jié)論:Order in Layer可以控制3D模型與UGUI的渲染順序,只需要背景的layer小于0椒振,前景l(fā)ayer大于0昭伸,而Z軸影響晚于3D模型渲染ui(也就是Layer大于0的ui)的ZTest,所以我們前景的UI的Z軸一定要小于模型的Z軸