Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 自顶向下或等轴测视图中的Unity Frostrum剔除_Unity3d_Graphics_Rendering_Game Development_Occlusion Culling - Fatal编程技术网

Unity3d 自顶向下或等轴测视图中的Unity Frostrum剔除

Unity3d 自顶向下或等轴测视图中的Unity Frostrum剔除,unity3d,graphics,rendering,game-development,occlusion-culling,Unity3d,Graphics,Rendering,Game Development,Occlusion Culling,我在Unity中遇到了一个问题,由于阴影投射,Unity无法在自顶向下或等轴测视图中剔除相机外的对象 平行光是对角的,因此光线来自的方向上摄影机视图外的任何对象都可能在摄影机视图中投射阴影。现在,在现实中,几乎所有这些对象只会在远低于地面的摄影机视图中投射阴影,因此它们实际上不需要渲染。然而,Unity并不知道这一点,它会为它们的阴影渲染它们,从而显著降低性能 我试着用遮挡剔除来解决这个问题。我在地面创建了一个巨大的平面,将其标记为静态,并为该对象烘焙遮挡消隐,以便地面下的任何东西都不会被渲染

我在Unity中遇到了一个问题,由于阴影投射,Unity无法在自顶向下或等轴测视图中剔除相机外的对象

平行光是对角的,因此光线来自的方向上摄影机视图外的任何对象都可能在摄影机视图中投射阴影。现在,在现实中,几乎所有这些对象只会在远低于地面的摄影机视图中投射阴影,因此它们实际上不需要渲染。然而,Unity并不知道这一点,它会为它们的阴影渲染它们,从而显著降低性能

我试着用遮挡剔除来解决这个问题。我在地面创建了一个巨大的平面,将其标记为静态,并为该对象烘焙遮挡消隐,以便地面下的任何东西都不会被渲染。不幸的是,这并没有帮助,所有那些阴影可能进入地面下方摄影机视图的对象仍在渲染中

另一种可能的解决方案是限制为每个对象生成阴影的范围。很多物体都很低,而且总是在地面上,所以我知道它们的阴影距离它们不可能超过1-2米。但我找不到一种方法来定义这样一个值,以便unity可以使用它进行筛选

关于如何克服这个问题还有其他想法吗


注意:整个场景是按程序生成的,因此除了地面本身,我不能使用静态遮挡消隐。

关于消隐过程的信息可能会帮助您了解需要执行的操作:

  • 当一个对象离开平截头体时,Unity会立即剔除它,剩下的仍然存在的Tri属于阴影
  • 当对象离开平截头体时,它仍会投射阴影。在内部,Unity将对象投射阴影模式转换为“仅阴影”。这意味着对象本身被剔除,而不是阴影
  • 阴影离开平截头体时不会立即剔除,它们使用摄影机的视野、远剪裁平面和平行光四元数的组合来确定何时剔除阴影
  • 没有细分的巨大对象也会弄乱遮挡
  • 这是所有编辑器的智慧,构建通常会表现出完全不同的行为
  • 反过来,减少阴影层叠、阴影距离、角度较小的平行光、相机透视和远剪裁平面都将有助于剔除过程和\或减少阴影中的tris计数

    顺便说一句,遮挡剔除是一个有效的解决方案,如果不熟悉系统,它就不那么容易使用