控制renderQueue解决NGUI与Unity3D物体渲染顺序问题

NGUI与Unity3D物体渲染顺序问题,做过UI的各位应该都遇到过。主要指的是UI与Unity制作的特效、3D人物等一同显示时的层次问题。

由于UI与特效等都是以transparent方式渲染,而Unity与NGUI在管理同是透明物体的render queue时实际上互相没有感知,于是引出排序问题。现在介绍以render queue值,来达到使得UI、特效按照我们希望的顺序进行渲染的目的。

这里先说明一下关于设置UI的draw call的细节,也是最繁琐的部分。我们知道NGUI会将采用同样材质的widget合并到同一个draw call中进行渲染。然而在我们这个需求中,这一功能导致了无法在widget之间插入其它渲染队列的问题,也就是原始的三明治问题。如果只是涉及到UI控件之间的穿插,NGUI可以通过depth设置来解决:

如果是使用同一材质的多个控件设置了不同的depth值,则NGUI还是将这些控件合并为同一个draw call
如果设置了不同depth的多个控件,穿插使用了不同的材质,则NGUI会将其打散为不同的draw call,顺序即按照depth指定。

在 Unity 中,material.renderQueue 是用于设置材质的渲染队列(Render Queue)的属性。渲染队列是用于控制渲染顺序的机制,它决定了对象在渲染管线中的绘制顺序,从而影响了它们在场景中的渲染顺序。

每个材质都有一个关联的渲染队列,决定了材质将在渲染管线的哪个阶段进行渲染。较小的渲染队列值表示对象将在渲染管线的早期渲染,而较大的渲染队列值表示对象将在渲染管线的后期渲染。

可以使用 material.renderQueue 属性来设置材质的渲染队列。通常情况下,这可以用于控制材质的渲染顺序,以解决透明对象的渲染问题,确保它们正确地在不同的深度顺序中渲染。

using UnityEngine;

public class RenderQueueExample : MonoBehaviour
{
    
    
    public Material customMaterial;
    public int customRenderQueue = 3000; // 设置自定义渲染队列值

    private void Start()
    {
    
    
        if (customMaterial != null)
        {
    
    
            customMaterial.renderQueue = customRenderQueue; // 设置材质的渲染队列值
        }
    }
}

customMaterial 是一个材质球,可以通过在 Unity 编辑器中将其分配给该脚本的公共字段。然后,您可以使用 customMaterial.renderQueue 属性来设置材质的渲染队列值。

优缺点

使用 material.renderQueue 来控制材质的渲染队列具有一些好处和潜在的坏处,这取决于项目的需求和使用情况。

好处:

解决透明对象的深度排序问题: 当场景中有多个透明对象重叠时,它们的渲染顺序对于正确显示是至关重要的。通过调整不同材质的渲染队列,您可以确保透明对象在正确的顺序中渲染,避免了深度排序问题。

实现特定渲染顺序: 有时,您可能希望特定的对象在渲染管线中的某个阶段进行渲染,例如在天空盒渲染之后或之前。通过设置渲染队列,您可以控制对象的渲染顺序,以满足您的需求。

定制渲染效果: 一些渲染效果可能需要对象以特定的顺序进行渲染。通过设置渲染队列,您可以实现定制的渲染效果,如描边、发光等。

坏处:

增加复杂性: 使用渲染队列可能会增加项目的复杂性,特别是当需要精细地调整渲染顺序时。过多的渲染队列调整可能会使项目难以维护。甚至可能多个UI或者物体公用了一个材质,但是不同场景下显示的位置不一致

潜在的渲染问题: 不正确地设置渲染队列可能会导致渲染问题,如对象闪烁(z_fightong)、深度冲突等。调整渲染队列时需要小心,确保在实际渲染中没有问题。

可能不适用于所有情况: 并非所有项目都需要显式控制渲染队列。一些项目中的默认渲染顺序可能已经足够满足需求,不需要额外的调整。调整Z轴可能是更好的解决方式

综上所述,使用 material.renderQueue 可以在某些情况下解决渲染顺序的问题,但在使用时需要谨慎。在进行渲染队列的调整时,最好测试并仔细观察渲染结果,以确保达到预期的效果。

后续我会补充图片说明

猜你喜欢

转载自blog.csdn.net/qq_45498613/article/details/132245399
今日推荐