Occlusion Culling for outdoors

EDIT - I’ve worked around this - code posted below

I’ve just started with the occlusion culling, and after reading existing threads I still have a couple of questions.

First - Is there anywhere that explains the OC logic? - if so, I can just figure this out myself.

I have a basic canyon like scene. I want optimal performance, obviously.

All I want to do is specify what I assume are view areas - A space where once inside, all objects in that space are visible. Anything completely outside is not. I think this is far simpler than the OC algorithm is suited for. But would also be much more useful in this case. I could write a script to do this in Start, but I’d rather avoid it.

I’m having two issues at the moment.
First, I’m getting a ‘pop’ at certain locations, where objects become ‘viewable’ even though they should be viewable much sooner. Cell size, I imagine.
Second, things outside view areas aren’t reliably being culled, whereas I would prefer they would always be. I gather this again has to do with the each cell determining what is viewable.

So my questions

  1. Should I just do this with triggers?
  2. What is the advantage of specifying view areas versus one large view area in an outdoor scene. It doesn’t appear to matter, excepting making things more complex.
  3. What is the in game overhead (aside from the massive render time) with having lots of view-cells? What about the same number of view cells in multiple view areas?
  4. What happens if some of the static objects are mesh combined (like trees) at runtime? Nothing good, I figure. I guess I’ll try to merge the mesh combine and export as OBJ scripts.[/b]

Ended up doing it with triggers instead. I’ll keep it updated at http://musegames.com/forum/posts/list/15.page

using UnityEngine;
using System.Collections;

public class RenderCulling : MonoBehaviour {
	public static RenderCulling RC;

	int zone = 0;
	public RenderGroup[] cullObjects;
	
	void Awake (){
		RC = this;	
	}
	void Start(){
		RefreshCulling();
			
	}
	public void EnterZone(int id){
		zone = id;	
		RefreshCulling();
	}
	void RefreshCulling(){
		foreach (RenderGroup cull in cullObjects){
			if (cull.zoneId == zone){
				foreach (MeshRenderer ren in cull.theRenderers){
					ren.enabled = true;
				}
			}
			else{
				foreach (MeshRenderer ren in cull.theRenderers){
					ren.enabled = false;
				}
			}
		}	
	}
}

[System.Serializable]
public class RenderGroup{
	public int zoneId;
	public MeshRenderer[] theRenderers;
	
}

And attached to trigger regions

using UnityEngine;
using System.Collections;

public class EnterCulling : MonoBehaviour {
	public int zoneID;
	RenderCulling manager;
	
	void Start(){
		manager = RenderCulling.RC;	
	}
	void OnTriggerEnter(Collider other){
		if(other.gameObject.tag=="Player"){
			manager.EnterZone(zoneID);
		}
		
	}
}