成都專業(yè)建站推廣公司自己建網(wǎng)站需要多少錢
NGUI與Unity3D物體渲染順序問題,做過UI的各位應(yīng)該都遇到過。主要指的是UI與Unity制作的特效、3D人物等一同顯示時(shí)的層次問題。
由于UI與特效等都是以transparent方式渲染,而Unity與NGUI在管理同是透明物體的render queue時(shí)實(shí)際上互相沒有感知,于是引出排序問題?,F(xiàn)在介紹以render queue值,來(lái)達(dá)到使得UI、特效按照我們希望的順序進(jìn)行渲染的目的。
這里先說明一下關(guān)于設(shè)置UI的draw call的細(xì)節(jié),也是最繁瑣的部分。我們知道NGUI會(huì)將采用同樣材質(zhì)的widget合并到同一個(gè)draw call中進(jìn)行渲染。然而在我們這個(gè)需求中,這一功能導(dǎo)致了無(wú)法在widget之間插入其它渲染隊(duì)列的問題,也就是原始的三明治問題。如果只是涉及到UI控件之間的穿插,NGUI可以通過depth設(shè)置來(lái)解決:
如果是使用同一材質(zhì)的多個(gè)控件設(shè)置了不同的depth值,則NGUI還是將這些控件合并為同一個(gè)draw call
如果設(shè)置了不同depth的多個(gè)控件,穿插使用了不同的材質(zhì),則NGUI會(huì)將其打散為不同的draw call,順序即按照depth指定。
在 Unity 中,material.renderQueue 是用于設(shè)置材質(zhì)的渲染隊(duì)列(Render Queue)的屬性。渲染隊(duì)列是用于控制渲染順序的機(jī)制,它決定了對(duì)象在渲染管線中的繪制順序,從而影響了它們?cè)趫?chǎng)景中的渲染順序。
每個(gè)材質(zhì)都有一個(gè)關(guān)聯(lián)的渲染隊(duì)列,決定了材質(zhì)將在渲染管線的哪個(gè)階段進(jìn)行渲染。較小的渲染隊(duì)列值表示對(duì)象將在渲染管線的早期渲染,而較大的渲染隊(duì)列值表示對(duì)象將在渲染管線的后期渲染。
可以使用 material.renderQueue 屬性來(lái)設(shè)置材質(zhì)的渲染隊(duì)列。通常情況下,這可以用于控制材質(zhì)的渲染順序,以解決透明對(duì)象的渲染問題,確保它們正確地在不同的深度順序中渲染。
using UnityEngine;public class RenderQueueExample : MonoBehaviour
{public Material customMaterial;public int customRenderQueue = 3000; // 設(shè)置自定義渲染隊(duì)列值private void Start(){if (customMaterial != null){customMaterial.renderQueue = customRenderQueue; // 設(shè)置材質(zhì)的渲染隊(duì)列值}}
}
customMaterial 是一個(gè)材質(zhì)球,可以通過在 Unity 編輯器中將其分配給該腳本的公共字段。然后,您可以使用 customMaterial.renderQueue 屬性來(lái)設(shè)置材質(zhì)的渲染隊(duì)列值。
優(yōu)缺點(diǎn)
使用 material.renderQueue 來(lái)控制材質(zhì)的渲染隊(duì)列具有一些好處和潛在的壞處,這取決于項(xiàng)目的需求和使用情況。
好處:
解決透明對(duì)象的深度排序問題: 當(dāng)場(chǎng)景中有多個(gè)透明對(duì)象重疊時(shí),它們的渲染順序?qū)τ谡_顯示是至關(guān)重要的。通過調(diào)整不同材質(zhì)的渲染隊(duì)列,您可以確保透明對(duì)象在正確的順序中渲染,避免了深度排序問題。
實(shí)現(xiàn)特定渲染順序: 有時(shí),您可能希望特定的對(duì)象在渲染管線中的某個(gè)階段進(jìn)行渲染,例如在天空盒渲染之后或之前。通過設(shè)置渲染隊(duì)列,您可以控制對(duì)象的渲染順序,以滿足您的需求。
定制渲染效果: 一些渲染效果可能需要對(duì)象以特定的順序進(jìn)行渲染。通過設(shè)置渲染隊(duì)列,您可以實(shí)現(xiàn)定制的渲染效果,如描邊、發(fā)光等。
壞處:
增加復(fù)雜性: 使用渲染隊(duì)列可能會(huì)增加項(xiàng)目的復(fù)雜性,特別是當(dāng)需要精細(xì)地調(diào)整渲染順序時(shí)。過多的渲染隊(duì)列調(diào)整可能會(huì)使項(xiàng)目難以維護(hù)。甚至可能多個(gè)UI或者物體公用了一個(gè)材質(zhì),但是不同場(chǎng)景下顯示的位置不一致
潛在的渲染問題: 不正確地設(shè)置渲染隊(duì)列可能會(huì)導(dǎo)致渲染問題,如對(duì)象閃爍(z_fightong)、深度沖突等。調(diào)整渲染隊(duì)列時(shí)需要小心,確保在實(shí)際渲染中沒有問題。
可能不適用于所有情況: 并非所有項(xiàng)目都需要顯式控制渲染隊(duì)列。一些項(xiàng)目中的默認(rèn)渲染順序可能已經(jīng)足夠滿足需求,不需要額外的調(diào)整。調(diào)整Z軸可能是更好的解決方式
綜上所述,使用 material.renderQueue 可以在某些情況下解決渲染順序的問題,但在使用時(shí)需要謹(jǐn)慎。在進(jìn)行渲染隊(duì)列的調(diào)整時(shí),最好測(cè)試并仔細(xì)觀察渲染結(jié)果,以確保達(dá)到預(yù)期的效果。
后續(xù)我會(huì)補(bǔ)充圖片說明