在项目中一个完成的游戏场景一般都会有成千上百的物体,假如都去让GPU全部渲染一遍,那带来的消耗其实是挺大的,很多不在摄像机范围内的物体其实没有必要去渲染,尽管GPU自带剔除,但是如果从CPU阶段就提交给GPU指令——哪些物体出现在摄像机中,哪些不在,那场景的负担也会小很多,视锥体剔除就是处理这样的问题。说明一下,在这里只是简单实现,说一下大致思路,实际大型项目开发中会更复杂。先看效果:
没剔除的时候:
剔除后的效果:
代码实现:
public class MyCull : MonoBehaviour
{
private Camera _camera;
public Transform parentTrans;
private Renderer[] meshRenders;
void Start()
{
_camera = GetComponent<Camera>();
meshRenders = parentTrans.GetComponentsInChildren<MeshRenderer>();
}
// Update is called once per frame
void Update()
{
Plane[] cameraPlane = GeometryUtility.CalculateFrustumPlanes(_camera);//得到摄像机的视锥平面
foreach (var item in meshRenders)
{
Bounds bounds = item.bounds;
bool isShow = GeometryUtility.TestPlanesAABB(cameraPlane,bounds);//判断是否在摄像机的视锥体中
item.enabled = isShow;
}
}
}