|
|
@@ -0,0 +1,124 @@
|
|
|
+Shader "Custom/URP_CloudSea_WaveSoft"
|
|
|
+{
|
|
|
+ Properties
|
|
|
+ {
|
|
|
+ _BottomColor("Bottom Fog Color", Color) = (0.55,0.62,0.7,0.9)
|
|
|
+ _TopColor("Top Fog Color", Color) = (1,1,1,0.4)
|
|
|
+
|
|
|
+ _NoiseTex("Noise Texture (BlackWhite)", 2D) = "white" {}
|
|
|
+ _NoiseTiling("Noise Tiling (Cloud Size)", Float) = 5.0
|
|
|
+ _NoiseSpeed("Noise Scroll Speed", Vector) = (0.015, 0.008, 0, 0)
|
|
|
+ _NoiseContrast("Noise Contrast (bright/dark strength)", Float) = 1.8
|
|
|
+ _NoiseBrightness("Noise Brightness Offset", Float) = 0.0
|
|
|
+
|
|
|
+ _WaveHeight("Wave Height", Float) = 1.2
|
|
|
+ _WaveFreq("Wave Frequency", Float) = 0.6
|
|
|
+
|
|
|
+ _DepthSoft("Scene Depth Softness", Float) = 8.0
|
|
|
+ _DepthOffset("Depth Offset", Float) = 0.0
|
|
|
+
|
|
|
+ _GradientHeight("Fog Vertical Gradient Range", Float) = 20.0
|
|
|
+ }
|
|
|
+
|
|
|
+ SubShader
|
|
|
+ {
|
|
|
+ Tags { "RenderType"="Transparent" "Queue"="Transparent+100" }
|
|
|
+ LOD 100
|
|
|
+
|
|
|
+ Blend SrcAlpha OneMinusSrcAlpha
|
|
|
+ ZWrite Off
|
|
|
+ Cull Off
|
|
|
+
|
|
|
+ Pass
|
|
|
+ {
|
|
|
+ HLSLPROGRAM
|
|
|
+ #pragma target 3.0
|
|
|
+ #pragma vertex vert
|
|
|
+ #pragma fragment frag
|
|
|
+ #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
+
|
|
|
+ // 深度
|
|
|
+ TEXTURE2D_X(_CameraDepthTexture);
|
|
|
+ SAMPLER(sampler_CameraDepthTexture);
|
|
|
+
|
|
|
+ // 噪声
|
|
|
+ TEXTURE2D(_NoiseTex);
|
|
|
+ SAMPLER(sampler_NoiseTex);
|
|
|
+
|
|
|
+ float4 _BottomColor;
|
|
|
+ float4 _TopColor;
|
|
|
+ float _NoiseTiling;
|
|
|
+ float2 _NoiseSpeed;
|
|
|
+ float _NoiseContrast;
|
|
|
+ float _NoiseBrightness;
|
|
|
+ float _WaveHeight;
|
|
|
+ float _WaveFreq;
|
|
|
+ float _DepthSoft;
|
|
|
+ float _DepthOffset;
|
|
|
+ float _GradientHeight;
|
|
|
+
|
|
|
+ struct appdata
|
|
|
+ {
|
|
|
+ float4 positionOS : POSITION;
|
|
|
+ float2 uv : TEXCOORD0;
|
|
|
+ };
|
|
|
+
|
|
|
+ struct v2f
|
|
|
+ {
|
|
|
+ float4 pos : SV_POSITION;
|
|
|
+ float3 worldPos : TEXCOORD0;
|
|
|
+ float2 uv : TEXCOORD1;
|
|
|
+ };
|
|
|
+
|
|
|
+ v2f vert(appdata v)
|
|
|
+ {
|
|
|
+ v2f o;
|
|
|
+ float3 pos = v.positionOS.xyz;
|
|
|
+ float2 uv = v.uv;
|
|
|
+
|
|
|
+ // 噪声uv滚动
|
|
|
+ float2 noiseUV = uv * _NoiseTiling + _NoiseSpeed * _Time.y;
|
|
|
+ float noise = SAMPLE_TEXTURE2D_LOD(_NoiseTex, sampler_NoiseTex, noiseUV, 0).r;
|
|
|
+
|
|
|
+ // 顶点Y轴起伏(保留你要的波浪)
|
|
|
+ float wave = sin(noise * 6.2831 * _WaveFreq);
|
|
|
+ pos.y += wave * _WaveHeight;
|
|
|
+
|
|
|
+ o.pos = TransformObjectToHClip(float4(pos,1));
|
|
|
+ o.worldPos = TransformObjectToWorld(pos);
|
|
|
+ o.uv = uv;
|
|
|
+ return o;
|
|
|
+ }
|
|
|
+
|
|
|
+ half4 frag(v2f i) : SV_Target
|
|
|
+ {
|
|
|
+ // 云自身世界Y高度
|
|
|
+ float h = i.worldPos.y / _GradientHeight;
|
|
|
+
|
|
|
+ // 上下雾色渐变
|
|
|
+ half4 fogCol = lerp(_BottomColor, _TopColor, saturate(h));
|
|
|
+
|
|
|
+ // 噪声明暗控制(只用R通道 -> cheap)
|
|
|
+ float2 noiseUV = i.uv * _NoiseTiling * 1.2 + _NoiseSpeed * 1.5 * _Time.y;
|
|
|
+ float n = SAMPLE_TEXTURE2D_LOD(_NoiseTex, sampler_NoiseTex, noiseUV, 0).r;
|
|
|
+ n = pow(n, _NoiseContrast) + _NoiseBrightness;
|
|
|
+
|
|
|
+ // 用噪声影响颜色亮暗
|
|
|
+ fogCol.rgb *= (0.6 + n * 0.5); // 生成暗亮斑块
|
|
|
+ fogCol.a *= (0.5 + n * 0.5); // 亮的地方更不透明一点
|
|
|
+
|
|
|
+ // 采样场景深度
|
|
|
+ float2 screenUV = i.pos.xy / _ScreenParams.xy;
|
|
|
+ float sceneRawDepth = SAMPLE_TEXTURE2D_X(_CameraDepthTexture, sampler_CameraDepthTexture, screenUV).r;
|
|
|
+ float sceneDepth = LinearEyeDepth(sceneRawDepth, _ZBufferParams);
|
|
|
+
|
|
|
+ float cloudDepth = i.pos.w + _DepthOffset;
|
|
|
+ float depthFade = saturate((sceneDepth - cloudDepth) / _DepthSoft);
|
|
|
+
|
|
|
+ fogCol.a *= depthFade;
|
|
|
+ return fogCol;
|
|
|
+ }
|
|
|
+ ENDHLSL
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|