Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


软件:unity:rendertexture

Unity Render Texture

类比Unreal的Render Target


这个东西可以将相机在3维空间中渲染的结果绘制到UI上。

我的思路

创建一个新的Layer,只有需要渲染到Texture的目标才能放到这个Layer

创建好专用的相机放到场景中,设置相机:只渲染这个特定的Layer,渲染结果输出到Texture,Texture当作图片的源放到UI上,这样就完成了整个渲染到输出的流程

自己按照需求控制相机的位置,一般情况下是建议先摆好相机可能出现的位置点,直接设置Transform移动过去

需要渲染一个物体的时候:

  • 把相机移动过来
  • 把渲染目标全都加到特定的Layer里面
// 渲染自己的时候,把自己全都加到某一个Layer
void _addToNpcOnDialogUILayer()
{
    int uiLayer = LayerMask.NameToLayer("NpcOnDialogUI");
    Transform[] transforms = GetComponentsInChildren<Transform>();
 
    foreach(Transform child in transforms)
    {
        child.gameObject.layer = uiLayer;
    }
}

不再需要渲染一个物体的时候:

  • 可以把相机关了
  • 把目标全部移回原来的Layer
// 不再渲染自己的时候,把自己全都加到Player Layer,这里可能有风险
void _removeFromNpcOnDialogUILayer() // To Default Player Layer
{
    int playerLayer = LayerMask.NameToLayer("Player");
    Transform[] transforms = GetComponentsInChildren<Transform>();
 
    foreach (Transform child in transforms)
    {
        child.gameObject.layer = playerLayer;
    }
}

总结:开始渲染结束渲染的时候都有需要执行的事情

缺点

  • 效率一般吧
  • 考虑一下,需要渲染的目标,其原本的逻辑功能是否依赖其所在Layer,把它移动到其他的Layer之后其功能受不受影响?
  • 有几个这样的需求,UI上要显示几个这样的Texture,就需要几个Layer?几个相机同时要渲染同一个物体呢?放到哪个Layer?感觉不太好组织管理

拓展

可以再研究一下这两个函数:

  • OnPreCull()
  • OnPostRender()
/var/www/DokuWikiStick/dokuwiki/data/pages/软件/unity/rendertexture.txt · Last modified: 2022/09/29 08:11 by zh