diff --git a/com.unity.render-pipelines.high-definition/Documentation~/Override-Cloud-Layer.md b/com.unity.render-pipelines.high-definition/Documentation~/Override-Cloud-Layer.md index da9ca42aa1a..a49e92dfa5b 100644 --- a/com.unity.render-pipelines.high-definition/Documentation~/Override-Cloud-Layer.md +++ b/com.unity.render-pipelines.high-definition/Documentation~/Override-Cloud-Layer.md @@ -26,8 +26,8 @@ This example Cloud Map is a read-only **CustomRenderTexture**. This means that, ## Customizing the Cloud Map -The Cloud Map is a 2D texture in LatLong layout (sometimes called Cylindrical or Equirectangular) that contains cloud color in the RGB channel and cloud coverage in the alpha channel. -If **Upper Hemisphere Only** is checked, the map is interpreted as being the upper half of a LatLong texture. +The Cloud Map is a 2D texture in LatLong layout (sometimes called Cylindrical or Equirectangular) that contains cloud opacity in the red channel. +If **Upper Hemisphere Only** is checked, the map is interpreted as being the upper half of a LatLong texture. It means that it will only conver the sky above the horizon. diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Shader/DefaultCloudLayerShader.shader b/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Shader/DefaultCloudLayerShader.shader index e6ebbeaa8c8..9d27c22d649 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Shader/DefaultCloudLayerShader.shader +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Shader/DefaultCloudLayerShader.shader @@ -18,6 +18,8 @@ Shader "Hidden/DefaultCloudLayer" Pass { + Name "Cloud Map" + CGPROGRAM #include "UnityCustomRenderTexture.cginc" diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Texture/DefaultCloudLayer.asset b/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Texture/DefaultCloudLayer.asset index 86fa47e3ea5..90c07aa77cd 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Texture/DefaultCloudLayer.asset +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Texture/DefaultCloudLayer.asset @@ -19,7 +19,7 @@ CustomRenderTexture: m_AntiAliasing: 1 m_MipCount: -1 m_DepthFormat: 0 - m_ColorFormat: 8 + m_ColorFormat: 9 m_MipMap: 0 m_GenerateMips: 1 m_SRGB: 0 diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.cs b/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.cs index 10815785e6d..31f980f39e1 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.cs @@ -43,7 +43,7 @@ public class CloudLayer : VolumeComponent public ClampedFloatParameter scrollDirection = new ClampedFloatParameter(0.0f, 0.0f, 360.0f); /// Speed of the distortion. [Tooltip("Sets the cloud scrolling speed. The higher the value, the faster the clouds will move.")] - public MinFloatParameter scrollSpeed = new MinFloatParameter(2.0f, 0.0f); + public MinFloatParameter scrollSpeed = new MinFloatParameter(1.0f, 0.0f); private float scrollFactor = 0.0f, lastTime = 0.0f; @@ -60,9 +60,6 @@ public class CloudLayer : VolumeComponent /// The shader parameters of the cloud layer. public Vector4 GetParameters() { - scrollFactor += scrollSpeed.value * (Time.time - lastTime) * 0.01f; - lastTime = Time.time; - float rot = -Mathf.Deg2Rad*scrollDirection.value; float upper = upperHemisphereOnly.value ? 1.0f : -1.0f; return new Vector4(upper * (rotation.value / 360.0f + 1), scrollFactor, Mathf.Cos(rot), Mathf.Sin(rot)); @@ -75,6 +72,9 @@ public static void Apply(CloudLayer layer, Material skyMaterial) { if (layer != null && layer.enabled.value == true) { + layer.scrollFactor += layer.scrollSpeed.value * (Time.time - layer.lastTime) * 0.01f; + layer.lastTime = Time.time; + Vector4 cloudParam = layer.GetParameters(); Vector4 cloudParam2 = layer.tint.value; cloudParam2.w = layer.intensityMultiplier.value; @@ -112,33 +112,8 @@ public override int GetHashCode() unchecked { -#if UNITY_2019_3 // In 2019.3, when we call GetHashCode on a VolumeParameter it generate garbage (due to the boxing of the generic parameter) - hash = cloudMap.value != null ? hash * 23 + cloudMap.value.GetHashCode() : hash; - hash = flowmap.value != null ? hash * 23 + flowmap.value.GetHashCode() : hash; - hash = hash * 23 + enabled.value.GetHashCode(); - hash = hash * 23 + upperHemisphereOnly.value.GetHashCode(); - hash = hash * 23 + tint.value.GetHashCode(); - hash = hash * 23 + intensityMultiplier.value.GetHashCode(); - hash = hash * 23 + rotation.value.GetHashCode(); - hash = hash * 23 + enableDistortion.value.GetHashCode(); - hash = hash * 23 + procedural.value.GetHashCode(); - hash = hash * 23 + scrollDirection.value.GetHashCode(); - hash = hash * 23 + scrollSpeed.value.GetHashCode(); - - hash = cloudMap.value != null ? hash * 23 + cloudMap.overrideState.GetHashCode() : hash; - hash = flowmap.value != null ? hash * 23 + flowmap.overrideState.GetHashCode() : hash; - hash = hash * 23 + enabled.overrideState.GetHashCode(); - hash = hash * 23 + upperHemisphereOnly.overrideState.GetHashCode(); - hash = hash * 23 + tint.overrideState.GetHashCode(); - hash = hash * 23 + intensityMultiplier.overrideState.GetHashCode(); - hash = hash * 23 + rotation.overrideState.GetHashCode(); - hash = hash * 23 + enableDistortion.overrideState.GetHashCode(); - hash = hash * 23 + procedural.overrideState.GetHashCode(); - hash = hash * 23 + scrollDirection.overrideState.GetHashCode(); - hash = hash * 23 + scrollSpeed.overrideState.GetHashCode(); -#else - hash = cloudMap.value != null ? hash * 23 + cloudMap.GetHashCode() : hash; - hash = flowmap.value != null ? hash * 23 + flowmap.GetHashCode() : hash; + hash = hash * 23 + cloudMap.GetHashCode(); + hash = hash * 23 + flowmap.GetHashCode(); hash = hash * 23 + enabled.GetHashCode(); hash = hash * 23 + upperHemisphereOnly.GetHashCode(); hash = hash * 23 + tint.GetHashCode(); @@ -148,7 +123,6 @@ public override int GetHashCode() hash = hash * 23 + procedural.GetHashCode(); hash = hash * 23 + scrollDirection.GetHashCode(); hash = hash * 23 + scrollSpeed.GetHashCode(); -#endif } return hash; diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.hlsl b/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.hlsl index e5614ad87d9..67cff3b0161 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.hlsl +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/CloudLayer/CloudLayer.hlsl @@ -19,12 +19,13 @@ float4 _CloudParam2; // xyz tint, w intensity #define USE_CLOUD_LAYER defined(USE_CLOUD_MAP) || (!defined(USE_CLOUD_MAP) && defined(USE_CLOUD_MOTION)) -float3 sampleCloud(float3 dir, float3 sky) +float4 sampleCloud(float3 dir) { float2 coords = GetLatLongCoords(dir, _CloudUpperHemisphere); coords.x = frac(coords.x + _CloudRotation); - float4 cloudLayerColor = SAMPLE_TEXTURE2D_LOD(_CloudMap, sampler_CloudMap, coords, 0); - return lerp(sky, sky + cloudLayerColor.rgb * _CloudTint * _CloudIntensity, cloudLayerColor.a); + float4 cloudLayerColor = SAMPLE_TEXTURE2D_LOD(_CloudMap, sampler_CloudMap, coords, 0).r; + cloudLayerColor.rgb *= _CloudTint * _CloudIntensity * cloudLayerColor.a; + return cloudLayerColor; } float3 CloudRotationUp(float3 p, float2 cos_sin) @@ -35,46 +36,53 @@ float3 CloudRotationUp(float3 p, float2 cos_sin) return float3(dot(rotDirX, p), p.y, dot(rotDirY, p)); } -float3 GetDistordedCloudColor(float3 dir, float3 sky) +float4 GetDistordedCloudColor(float3 dir) { #if USE_CLOUD_MOTION - if (dir.y >= 0 || !_CloudUpperHemisphere) - { - float2 alpha = frac(float2(_CloudScrollFactor, _CloudScrollFactor + 0.5)) - 0.5; + float2 alpha = frac(float2(_CloudScrollFactor, _CloudScrollFactor + 0.5)) - 0.5; #ifdef USE_CLOUD_MAP - float3 tangent = normalize(cross(dir, float3(0.0, 1.0, 0.0))); - float3 bitangent = cross(tangent, dir); + float3 tangent = normalize(cross(dir, float3(0.0, 1.0, 0.0))); + float3 bitangent = cross(tangent, dir); - float3 windDir = CloudRotationUp(dir, _CloudScrollDirection); - float2 flow = SAMPLE_TEXTURE2D_LOD(_CloudFlowmap, sampler_CloudFlowmap, GetLatLongCoords(windDir, _CloudUpperHemisphere), 0).rg * 2.0 - 1.0; + float3 windDir = CloudRotationUp(dir, _CloudScrollDirection); + float2 flow = SAMPLE_TEXTURE2D_LOD(_CloudFlowmap, sampler_CloudFlowmap, GetLatLongCoords(windDir, _CloudUpperHemisphere), 0).rg * 2.0 - 1.0; - float3 dd = flow.x * tangent + flow.y * bitangent; + float3 dd = flow.x * tangent + flow.y * bitangent; #else - float3 windDir = CloudRotationUp(float3(0, 0, 1), _CloudScrollDirection); - windDir.x *= -1.0; - float3 dd = windDir*sin(dir.y*PI*0.5); + float3 windDir = CloudRotationUp(float3(0, 0, 1), _CloudScrollDirection); + windDir.x *= -1.0; + float3 dd = windDir*sin(dir.y*PI*0.5); #endif - // Sample twice - float3 color1 = sampleCloud(normalize(dir - alpha.x * dd), sky); - float3 color2 = sampleCloud(normalize(dir - alpha.y * dd), sky); + // Sample twice + float4 color1 = sampleCloud(normalize(dir - alpha.x * dd)); + float4 color2 = sampleCloud(normalize(dir - alpha.y * dd)); - // Blend color samples - sky = lerp(color1, color2, abs(2.0 * alpha.x)); - } - return sky; + // Blend color samples + return lerp(color1, color2, abs(2.0 * alpha.x)); #else - return sampleCloud(dir, sky); + return sampleCloud(dir); #endif } +float GetCloudOpacity(float3 dir) +{ +#if USE_CLOUD_LAYER + if (dir.y >= 0 || !_CloudUpperHemisphere) + return GetDistordedCloudColor(dir).a; + else +#endif + + return 0; +} + float3 ApplyCloudLayer(float3 dir, float3 sky) { #if USE_CLOUD_LAYER if (dir.y >= 0 || !_CloudUpperHemisphere) - sky = GetDistordedCloudColor(dir, sky); + sky += GetDistordedCloudColor(dir).rgb; #endif return sky; diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs index a68ed110d27..95fc6e846b2 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs @@ -670,7 +670,7 @@ int ComputeSkyHash(HDCamera camera, SkyUpdateContext skyContext, Light sunLight, sunHash = GetSunLightHashCode(sunLight); int cloudHash = 0; - if (skyContext.cloudLayer != null && skyContext.skyRenderer.SupportCloudLayer) + if (skyContext.cloudLayer != null && skyContext.skyRenderer.SupportDynamicCloudLayer) cloudHash = skyContext.cloudLayer.GetHashCode(); // For planar reflections we want to use the parent position for hash. diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs index 64d226a480b..2449c1b37ed 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs @@ -10,7 +10,7 @@ public abstract class SkyRenderer /// Determines if the sky should be rendered when the sun light changes. public bool SupportDynamicSunLight = true; /// Determines if the sky should be rendered when the cloud layer changes. - public bool SupportCloudLayer = true; + public bool SupportDynamicCloudLayer = true; /// /// Called on startup. Create resources used by the renderer (shaders, materials, etc).