RenderTexture管理器(一个摄像机渲染多个RenderTexture)

UI中显示模型一般都两种方法,

1.直接把3d模型放到ui里面(要处理层级问题和适配问题)

2.把模型直接渲染到Rendertexture上面(层级基本不用处理适配就是框架里面的适配)

不是说把renderTexture就是好,一切看实际情况

例如你要做剧情对话,那些ui有变暗或者渐现效果,用renderTexture比较好处理这些效果

-----------------------------------------------------------------------------------------------------------------

现在有遇到难题多个模型渲染难道要我一个模型一个摄像机吗?当然这种操作不科学

所以写了个管理器用一个摄像机渲染多个模型

原理是手动调用摄像机渲染(每次渲染都设置层,渲染完就还原原来的层)

        m_camera.Render();

效果如下图

下面是管理器完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public sealed class RenderTextureMgr : MonoBehaviour
{
    public Camera m_camera { get; private set; }

    public Light m_light { get; private set; }

    private static RenderTextureMgr mgr;

    public static RenderTextureMgr GetIns()
    {
        if (null == mgr)
        {
            GameObject go = new GameObject("RenderToTexture");
            mgr = go.AddComponent<RenderTextureMgr>();
            mgr.enabled = false;
            mgr.Init();
        }
        return mgr;
    }

    /// <summary>
    /// 初始化创建摄像机和灯光
    /// </summary>
    public void Init()
    {
        GameObject.DontDestroyOnLoad(gameObject);
        m_camera = gameObject.AddComponent<Camera>();
        m_camera.farClipPlane = 100;
        m_camera.aspect = 1;
        m_camera.clearFlags = CameraClearFlags.SolidColor;
        m_camera.cullingMask = 1 << 5;
        m_camera.backgroundColor = Color.clear;
        m_camera.enabled = false;
        m_camera.fieldOfView = 35;
        m_camera.orthographic = false;
        //m_camera.orthographicSize = 1;
        m_camera.transform.position = new Vector3(-500, -500, -500);
        m_light = gameObject.AddComponent<Light>();
        m_light.type = LightType.Directional;
        m_light.intensity = 1.25f;
        m_light.cullingMask = 1 << 5;
    }


    public void Render(RenderTexture renderTexture, Transform target)
    {
        if (null == renderTexture || null == target)
        {
            return;
        }
        //获取所有render记录layer
        Dictionary<Renderer, int> layerDict = new Dictionary<Renderer, int>();
        Renderer[] children = target.GetComponentsInChildren<Renderer>();
        for (int i = children.Length; --i >= 0;)
        {
            Renderer child = children[i];
            layerDict[child] = child.gameObject.layer;
            child.gameObject.layer = 5;
        }

        //设置renderTexture
        m_camera.targetTexture = renderTexture;

        //主动调用摄像机渲染(camera.enable = false都可以渲染)
        m_camera.Render();

        //还原渲染层
        for (int i = children.Length; --i >= 0;)
        {
            Renderer child = children[i];
            child.gameObject.layer = layerDict[child];
        }

        layerDict.Clear();
        layerDict = null;
    }
}

下面是测试脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TestRender : MonoBehaviour
{
    public RenderTexture rt;

    public RawImage image;

    private RenderTexture m_rt;

    private void Awake()
    {
        m_rt = new RenderTexture(rt);
        image.texture = m_rt;
    }

    private void Update()
    {
        RenderTextureMgr.GetIns().Render(m_rt, transform);
    }
}

把测试脚本挂的模型上面,把ui上面的rawimage控件拖过去,把设置好的rendertexture拖过去就可以测试

测试设置如下图

最后附上工程

链接:https://pan.baidu.com/s/1WFRZ7QK5WSgXMY_YKyfanw 
提取码:jme4 
复制这段内容后打开百度网盘手机App,操作更方便哦

猜你喜欢

转载自blog.csdn.net/SnoopyNa2Co3/article/details/84779183