diff --git a/ProceduralSkyInitializer.cs b/ProceduralSkyInitializer.cs index 389376b..eb8fc04 100644 --- a/ProceduralSkyInitializer.cs +++ b/ProceduralSkyInitializer.cs @@ -9,8 +9,8 @@ public class ProceduralSkyInitializer : MonoBehaviour public const float moonDistanceToCamera = 10; private Light dirLight; - private Camera mainCam; + private Material _layeredCubemap; private Material _skyMaterial; private AudioClip _rainAudioClip; private GameObject _cloudPrefab; @@ -27,6 +27,7 @@ public void Init () // Load the asset bundle AssetBundle assets = AssetBundle.LoadFromFile(Main.ModPath + "Resources/proceduralskymod"); + _layeredCubemap = assets.LoadAsset("Assets/Materials/CubemapOverlay.mat"); _skyMaterial = assets.LoadAsset("Assets/Materials/Sky.mat"); _rainAudioClip = assets.LoadAsset("Assets/Audio/rain-03.wav"); _cloudPrefab = assets.LoadAsset("Assets/Prefabs/CloudPlane.prefab"); @@ -80,41 +81,44 @@ public void Init () #if DEBUG Debug.Log(">>> >>> >>> Setting Up Cameras..."); #endif - // main cam - mainCam = GameObject.FindGameObjectWithTag("MainCamera").GetComponent(); - mainCam.clearFlags = CameraClearFlags.Depth; - mainCam.cullingMask = -1; - mainCam.cullingMask &= ~(1 << 31); - //mainCam.depth = -1; // original setting - + Camera.main.cullingMask = -1; + Camera.main.cullingMask &= ~(1 << 31); + + // clear cam + Camera clearCam = new GameObject() { name = "ClearCam" }.AddComponent(); + clearCam.transform.SetParent(psMaster.transform, false); + clearCam.clearFlags = CameraClearFlags.Skybox; + clearCam.cullingMask = 0; + clearCam.enabled = false; + + // override clearCam's skybox with skyMaterial to render sun disk + Skybox clearCamSkybox = clearCam.gameObject.AddComponent(); + clearCamSkybox.material = skyMaterial; + // sky cam Camera skyCam = new GameObject() { name = "SkyCam" }.AddComponent(); - GameObject skyCamGimbal = new GameObject { name = "SkyCamGimbal" }; - skyCamGimbal.transform.SetParent(psMaster.transform, false); - skyCam.transform.SetParent(skyCamGimbal.transform, false); - skyCam.clearFlags = CameraClearFlags.Depth; + skyCam.transform.SetParent(psMaster.transform, false); + skyCam.clearFlags = CameraClearFlags.Color; + skyCam.backgroundColor = Color.clear; skyCam.cullingMask = 0; skyCam.cullingMask |= 1 << 31; - skyCam.depth = -2; - skyCam.fieldOfView = mainCam.fieldOfView; - skyCam.nearClipPlane = mainCam.nearClipPlane; skyCam.farClipPlane = 100; - // this localScale negates VR stereo separation - skyCamGimbal.transform.localScale = Vector3.zero; - skyCamGimbal.AddComponent().source = psMaster.transform; - - // clear cam - Camera clearCam = new GameObject() { name = "ClearCam" }.AddComponent(); - clearCam.clearFlags = CameraClearFlags.Skybox; - clearCam.cullingMask = 0; - clearCam.depth = -3; - clearCam.fieldOfView = mainCam.fieldOfView; - - SkyCamConstraint constraint = skyCam.gameObject.AddComponent(); - constraint.main = mainCam; - constraint.sky = skyCam; - constraint.clear = clearCam; - + skyCam.enabled = false; + + // skyCamOutputMat will be used for global skybox + int skyCamTexSize = 4096; + RenderTexture clearCamTex = new RenderTexture(skyCamTexSize/4, skyCamTexSize/4, 0, RenderTextureFormat.DefaultHDR); + clearCamTex.dimension = UnityEngine.Rendering.TextureDimension.Cube; + RenderTexture skyCamTex = new RenderTexture(skyCamTexSize, skyCamTexSize, 0, RenderTextureFormat.DefaultHDR); + skyCamTex.dimension = UnityEngine.Rendering.TextureDimension.Cube; + Material skyCamOutputMat = _layeredCubemap; + skyCamOutputMat.SetTexture("_Tex", clearCamTex); // shader: Skybox/Cubemap + skyCamOutputMat.SetTexture("_AlphaTex", skyCamTex); // shader: Skybox/CubemapOverlay + + // initialize skybox + clearCam.RenderToCubemap(clearCamTex); + skyCam.RenderToCubemap(skyCamTex); + // cloud render texture cam Camera cloudRendTexCam = new GameObject() { name = "CloudRendTexCam" }.AddComponent(); cloudRendTexCam.transform.SetParent(psMaster.transform); @@ -169,7 +173,7 @@ public void Init () Debug.Log(">>> >>> >>> Setting Up Audio Sources..."); #endif GameObject psAudio = new GameObject() { name = "ProceduralSkyAudio" }; - psAudio.transform.SetParent(mainCam.transform); + psAudio.transform.SetParent(Camera.main.transform); RainController.RainAudio = psAudio.AddComponent(); RainController.RainAudio.clip = _rainAudioClip; @@ -218,6 +222,7 @@ public void Init () Debug.Log(">>> >>> >>> Setting Up Starbox..."); #endif GameObject starBox = GameObject.CreatePrimitive(PrimitiveType.Cube); + _starMaterial.SetFloat("_Exposure", .5f); starBox.GetComponent().sharedMaterial = _starMaterial; starBox.transform.SetParent(skyboxNight.transform); starBox.transform.ResetLocal(); @@ -247,7 +252,7 @@ public void Init () GameObject psRainParticleSys = new GameObject() { name = "ProceduralSkyRainParticleSystem" }; PositionConstraintOnUpdate psRainParticleSysconstraint = psRainParticleSys.AddComponent(); - psRainParticleSysconstraint.source = mainCam.transform; + psRainParticleSysconstraint.source = Camera.main.transform; GameObject rainObj = GameObject.Instantiate(_rainPrefab); rainObj.transform.SetParent(psRainParticleSys.transform); @@ -278,11 +283,12 @@ public void Init () skyManager.StarMaterial = starBox.GetComponent().sharedMaterial; - skyManager.SkyCam = skyCam.transform; + skyManager.ClearCam = clearCam; + skyManager.ClearCamTex = clearCamTex; + skyManager.SkyCam = skyCam; + skyManager.SkyCamTex = skyCamTex; skyManager.SkyMaterial = skyMaterial; - skyManager.ClearCam = clearCam.transform; - skyManager.MoonPathCenter = moonBillboard.transform; skyManager.MoonMaterial = moonBillboard.GetComponent().sharedMaterial; @@ -291,7 +297,7 @@ public void Init () #endif // Set render settings RenderSettings.sun = dirLight; - RenderSettings.skybox = skyMaterial; + RenderSettings.skybox = skyCamOutputMat; RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Flat; #if DEBUG diff --git a/Resources/proceduralskymod b/Resources/proceduralskymod index 131002e..6c28627 100644 Binary files a/Resources/proceduralskymod and b/Resources/proceduralskymod differ diff --git a/SkyManager.cs b/SkyManager.cs index b99d466..856e813 100644 --- a/SkyManager.cs +++ b/SkyManager.cs @@ -26,8 +26,10 @@ public class SkyManager : MonoBehaviour public Material CloudMaterial { get; set; } public Material MoonMaterial { get; set; } - public Transform ClearCam { get; set; } - public Transform SkyCam { get; set; } + public Camera SkyCam { get; set; } + public RenderTexture SkyCamTex { get; set; } + public Camera ClearCam { get; set; } + public RenderTexture ClearCamTex { get; set; } public Transform CloudPlane { get; set; } void Start () @@ -55,6 +57,9 @@ void Update () else SunLight.cookie = null; + ClearCam.RenderToCubemap(ClearCamTex, 63 & ~(1 << (int)CubemapFace.NegativeY)); + SkyCam.RenderToCubemap(SkyCamTex, 63 & ~(1 << (int)CubemapFace.NegativeY)); + #if !CYBEX_TIME // fauxnik time algo ProceduralSkyTimeSource.Instance.CalculateTimeProgress(Time.deltaTime); @@ -111,7 +116,7 @@ void Update () SunLight.intensity = sunOverHorizonFac * 1.5f; SunLight.color = Color.Lerp(new Color(1f, 0.5f, 0), Color.white, sunOverHorizonFac); - StarMaterial.SetFloat("_Visibility", (-sunOverHorizonFac + 1) * .01f); + StarMaterial.SetFloat("_Visibility", Mathf.Clamp01(1f - 4f * sunOverHorizonFac)); MoonMaterial.SetFloat("_MoonDayNight", Mathf.Lerp(2.19f, 1.5f, sunOverHorizonFac)); // gives aproximate moon phase