private void Start() { try { Mesh mesh = this.CreateBottomMesh(32, 512); this.m_bottomMask = new GameObject("Ceto Bottom Mask Gameobject"); MeshFilter meshFilter = this.m_bottomMask.AddComponent <MeshFilter>(); MeshRenderer meshRenderer = this.m_bottomMask.AddComponent <MeshRenderer>(); NotifyOnWillRender notifyOnWillRender = this.m_bottomMask.AddComponent <NotifyOnWillRender>(); meshFilter.sharedMesh = mesh; meshRenderer.receiveShadows = false; meshRenderer.shadowCastingMode = ShadowCastingMode.Off; meshRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off; meshRenderer.material = new Material(this.oceanBottomSdr); notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderWaveOverlays)); notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderOceanMask)); notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderOceanDepth)); this.m_bottomMask.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); this.m_bottomMask.hideFlags = HideFlags.HideAndDontSave; this.UpdateBottomBounds(); UnityEngine.Object.Destroy(mesh); } catch (Exception ex) { Ocean.LogError(ex.ToString()); base.WasError = true; base.enabled = false; } }
void Start() { try { m_refractionCommand = new RefractionCommand(copyDepthSdr); Mesh mesh = CreateBottomMesh(32, 512); //The bottom used to render the masks. m_bottomMask = new GameObject("Ceto Bottom Mask Gameobject"); MeshFilter filter = m_bottomMask.AddComponent <MeshFilter>(); MeshRenderer renderer = m_bottomMask.AddComponent <MeshRenderer>(); NotifyOnWillRender willRender = m_bottomMask.AddComponent <NotifyOnWillRender>(); filter.sharedMesh = mesh; renderer.receiveShadows = false; renderer.shadowCastingMode = ShadowCastingMode.Off; renderer.reflectionProbeUsage = ReflectionProbeUsage.Off; renderer.material = new Material(oceanBottomSdr); willRender.AddAction(m_ocean.RenderWaveOverlays); willRender.AddAction(m_ocean.RenderOceanMask); willRender.AddAction(m_ocean.RenderOceanDepth); m_bottomMask.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); m_bottomMask.hideFlags = HideFlags.HideAndDontSave; UpdateBottomBounds(); Destroy(mesh); } catch (Exception e) { Ocean.LogError(e.ToString()); WasError = true; enabled = false; } }
/// <summary> /// Creates the grid for this resolution setting. /// </summary> void CreateGrid(MESH_RESOLUTION meshRes) { if (!m_grids.ContainsKey(meshRes)) { m_grids.Add(meshRes, new Grid()); } Grid grid = m_grids[meshRes]; int screenWidth = ScreenWidth(); int screenHeight = ScreenHeight(); int resolution = ResolutionToNumber(meshRes); int groups = ChooseGroupSize(resolution, gridGroups, screenWidth, screenHeight); if (!ForceRecreate && grid.screenWidth == screenWidth && grid.screenHeight == screenHeight && grid.groups == groups) { //Have already created a grid for this //resolution at the current screen size return; } else { //Grid has either not been created or the screen has been resized. //Clear grid and create. ClearGrid(grid); grid.screenWidth = screenWidth; grid.screenHeight = screenHeight; grid.resolution = resolution; grid.groups = groups; } ForceRecreate = false; //Create the quads that will make up the grid. //The grid covers the screen and is split up //into smaller quads. Each quads has a mesh. IList <Mesh> meshs = CreateScreenQuads(resolution, groups, screenWidth, screenHeight); //For each mesh make a gameobject for the top side and under side. foreach (Mesh mesh in meshs) { if (oceanTopSideMat != null) { GameObject top = new GameObject("Ceto TopSide Grid LOD: " + meshRes); MeshFilter filter = top.AddComponent <MeshFilter>(); MeshRenderer renderer = top.AddComponent <MeshRenderer>(); //The notify script will call the added functions when OnWillRender is called. NotifyOnWillRender willRender = top.AddComponent <NotifyOnWillRender>(); filter.sharedMesh = mesh; renderer.shadowCastingMode = ShadowCastingMode.Off; renderer.receiveShadows = receiveShadows; renderer.sharedMaterial = oceanTopSideMat; renderer.reflectionProbeUsage = reflectionProbes; top.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); top.hideFlags = HideFlags.HideAndDontSave; //Must render reflection first or it will cause so artefacts on ocean //for some reason. Its related to the overlays but exact cause is unknown. willRender.AddAction(m_ocean.RenderReflection); willRender.AddAction(ApplyProjection); willRender.AddAction(m_ocean.RenderWaveOverlays); willRender.AddAction(m_ocean.RenderOceanMask); willRender.AddAction(m_ocean.RenderOceanDepth); grid.top.Add(top); grid.topRenderer.Add(renderer); grid.topFilters.Add(filter); } if (oceanUnderSideMat) { GameObject under = new GameObject("Ceto UnderSide Grid LOD: " + meshRes); MeshFilter filter = under.AddComponent <MeshFilter>(); MeshRenderer renderer = under.AddComponent <MeshRenderer>(); //The notify script will call the added functions when OnWillRender is called. NotifyOnWillRender willRender = under.AddComponent <NotifyOnWillRender>(); filter.sharedMesh = mesh; renderer.shadowCastingMode = ShadowCastingMode.Off; renderer.receiveShadows = receiveShadows; renderer.reflectionProbeUsage = reflectionProbes; renderer.sharedMaterial = oceanUnderSideMat; under.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); under.hideFlags = HideFlags.HideAndDontSave; willRender.AddAction(ApplyProjection); willRender.AddAction(m_ocean.RenderWaveOverlays); willRender.AddAction(m_ocean.RenderOceanMask); willRender.AddAction(m_ocean.RenderOceanDepth); grid.under.Add(under); grid.underRenderer.Add(renderer); grid.underFilters.Add(filter); } Destroy(mesh); } }
/// <summary> /// Creates the grid for this resolution setting. /// </summary> void CreateGrid(MESH_RESOLUTION meshRes) { Grid grid = null; if (!m_grids.TryGetValue((int)meshRes, out grid)) //OYM: 先获取一下网格,如果能获取到就不创建新的了 //OYM: 注意一下,这里的int转换出来是1234,但是下面那个取出来是1248. { grid = new Grid(); m_grids.Add((int)meshRes, grid); } //OYM: 获取屏幕大小 int screenWidth = ScreenWidth(); int screenHeight = ScreenHeight(); int resolution = ResolutionToNumber(meshRes); //OYM: 对就是这里 int groups = ChooseGroupSize(resolution, gridGroups, screenWidth, screenHeight); //OYM: 选择分割的合适大小 if (grid.screenWidth == screenWidth && grid.screenHeight == screenHeight && grid.groups == groups) { //OYM: 已经在当前分辨率下创建了一个网格 //Have already created a grid for this //resolution at the current screen size return; } else { //Grid has either not been created or the screen has been resized. //Clear grid and create. ClearGrid(grid);//OYM: 创建一个网格 grid.screenWidth = screenWidth; grid.screenHeight = screenHeight; grid.resolution = resolution; //OYM: 解析度 grid.groups = groups; //OYM: 数目,-1代表只有一个 } //Create the quads that will make up the grid. //The grid covers the screen and is split up //into smaller quads. Each quads has a mesh. IList <Mesh> meshs = CreateScreenQuads(resolution, groups, screenWidth, screenHeight); //For each mesh make a gameobject for the top side and under side. foreach (Mesh mesh in meshs) { if (oceanTopSideMat != null) { //OYM: 创建海洋实体 GameObject top = new GameObject("Ceto TopSide Grid LOD: " + meshRes); MeshFilter filter = top.AddComponent <MeshFilter>(); MeshRenderer renderer = top.AddComponent <MeshRenderer>(); //The notify script will call the added functions when OnWillRender is called. NotifyOnWillRender willRender = top.AddComponent <NotifyOnWillRender>(); //OYM: 本质上是一个component.实际上还不清楚 filter.sharedMesh = mesh; //OYM: 设置mesh renderer.shadowCastingMode = ShadowCastingMode.Off; //OYM: 不投射阴影 renderer.receiveShadows = receiveShadows; //OYM: 是否产生阴影 renderer.sharedMaterial = oceanTopSideMat; //OYM: 设置mat renderer.reflectionProbeUsage = reflectionProbes; //OYM: 设置反射球(所以还是用unity的反射吗) top.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); //OYM: 设置层级 //top.hideFlags = HideFlags.HideAndDontSave; //OYM: 难怪选不中,原来在这里被藏起来了 //Must render reflection first or it will cause so artefacts on ocean //for some reason. Its related to the overlays but exact cause is unknown. willRender.AddAction(m_ocean.RenderReflection); //OYM: 需要先渲染反射,否则海洋可能看起来像是人工制品一样 //OYM: 这底下的方法就难啃了 willRender.AddAction(ApplyProjection); willRender.AddAction(m_ocean.RenderWaveOverlays); willRender.AddAction(m_ocean.RenderOceanMask); willRender.AddAction(m_ocean.RenderOceanDepth); grid.top.Add(top); grid.topRenderer.Add(renderer); grid.topFilters.Add(filter); } if (oceanUnderSideMat) { GameObject under = new GameObject("Ceto UnderSide Grid LOD: " + meshRes); MeshFilter filter = under.AddComponent <MeshFilter>(); MeshRenderer renderer = under.AddComponent <MeshRenderer>(); //The notify script will call the added functions when OnWillRender is called. NotifyOnWillRender willRender = under.AddComponent <NotifyOnWillRender>(); filter.sharedMesh = mesh; renderer.shadowCastingMode = ShadowCastingMode.Off; renderer.receiveShadows = receiveShadows; renderer.reflectionProbeUsage = reflectionProbes; renderer.sharedMaterial = oceanUnderSideMat; under.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); under.hideFlags = HideFlags.HideAndDontSave; willRender.AddAction(ApplyProjection); willRender.AddAction(m_ocean.RenderWaveOverlays); willRender.AddAction(m_ocean.RenderOceanMask); willRender.AddAction(m_ocean.RenderOceanDepth); grid.under.Add(under); grid.underRenderer.Add(renderer); grid.underFilters.Add(filter); } Destroy(mesh); } }
private void CreateGrid(MESH_RESOLUTION meshRes) { ProjectedGrid.Grid grid = null; if (!this.m_grids.TryGetValue(meshRes, out grid)) { grid = new ProjectedGrid.Grid(); this.m_grids.Add(meshRes, grid); } int num = this.ScreenWidth(); int num2 = this.ScreenHeight(); int num3 = this.ResolutionToNumber(meshRes); int num4 = this.ChooseGroupSize(num3, this.gridGroups, num, num2); if (!base.ForceRecreate && grid.screenWidth == num && grid.screenHeight == num2 && grid.groups == num4) { return; } this.ClearGrid(grid); grid.screenWidth = num; grid.screenHeight = num2; grid.resolution = num3; grid.groups = num4; base.ForceRecreate = false; IList <Mesh> list = this.CreateScreenQuads(num3, num4, num, num2); foreach (Mesh mesh in list) { if (this.oceanTopSideMat != null) { GameObject gameObject = new GameObject("Ceto TopSide Grid LOD: " + meshRes); MeshFilter meshFilter = gameObject.AddComponent <MeshFilter>(); MeshRenderer meshRenderer = gameObject.AddComponent <MeshRenderer>(); NotifyOnWillRender notifyOnWillRender = gameObject.AddComponent <NotifyOnWillRender>(); meshFilter.sharedMesh = mesh; meshRenderer.shadowCastingMode = ShadowCastingMode.Off; meshRenderer.receiveShadows = this.receiveShadows; meshRenderer.sharedMaterial = this.oceanTopSideMat; meshRenderer.reflectionProbeUsage = this.reflectionProbes; gameObject.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); gameObject.hideFlags = HideFlags.HideAndDontSave; notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderReflection)); notifyOnWillRender.AddAction(new Action <GameObject>(this.ApplyProjection)); notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderWaveOverlays)); notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderOceanMask)); notifyOnWillRender.AddAction(new Action <GameObject>(this.m_ocean.RenderOceanDepth)); grid.top.Add(gameObject); grid.topRenderer.Add(meshRenderer); grid.topFilters.Add(meshFilter); } if (this.oceanUnderSideMat) { GameObject gameObject2 = new GameObject("Ceto UnderSide Grid LOD: " + meshRes); MeshFilter meshFilter2 = gameObject2.AddComponent <MeshFilter>(); MeshRenderer meshRenderer2 = gameObject2.AddComponent <MeshRenderer>(); NotifyOnWillRender notifyOnWillRender2 = gameObject2.AddComponent <NotifyOnWillRender>(); meshFilter2.sharedMesh = mesh; meshRenderer2.shadowCastingMode = ShadowCastingMode.Off; meshRenderer2.receiveShadows = this.receiveShadows; meshRenderer2.reflectionProbeUsage = this.reflectionProbes; meshRenderer2.sharedMaterial = this.oceanUnderSideMat; gameObject2.layer = LayerMask.NameToLayer(Ocean.OCEAN_LAYER); gameObject2.hideFlags = HideFlags.HideAndDontSave; notifyOnWillRender2.AddAction(new Action <GameObject>(this.ApplyProjection)); notifyOnWillRender2.AddAction(new Action <GameObject>(this.m_ocean.RenderWaveOverlays)); notifyOnWillRender2.AddAction(new Action <GameObject>(this.m_ocean.RenderOceanMask)); notifyOnWillRender2.AddAction(new Action <GameObject>(this.m_ocean.RenderOceanDepth)); grid.under.Add(gameObject2); grid.underRenderer.Add(meshRenderer2); grid.underFilters.Add(meshFilter2); } UnityEngine.Object.Destroy(mesh); } }