Untitled
unknown
glsl
a year ago
3.3 kB
11
Indexable
// Fractional value for sample position in the cloud layer .
float GetHeightFractionForPoint ( float3 inPosition , float2 inCloudMinMax )
{
// Get global fractional position in cloud zone .
float height_fraction = (inPosition.z ? inCloudMinMax.x ) / ( inCloudMinMax.y ? inCloudMinMax.x ) ;
return saturate ( height_fraction ) ;
}
// Utility function that maps a value from one range to another .
float Remap ( float original_value , float original_min , float original_max , float new_min , float new_max )
{
return new_min + ( ( ( original_value ? original_min) / ( original_max ? original_min ) ) ? ( new_max ? new_min ) );
}
float SampleCloudDensity ( float3 p , float3 weather_data )
{
// Read the low?frequency Perlin?Worley and Worley noises.
float4 low_frequency_noises = tex3Dlod ( Cloud3DNoiseTextureA , Cloud3DNoiseSamplerA , float4 ( p , mip_level) ).rgba;
// Build an FBM out of the low frequency Worley noises
// that can be used to add detail to the low?frequency
// Perlin?Worley noise.
float low_freq_FBM = ( low_frequency_noises.g ? 0.625 )
+ ( low_frequency_noises.b ? 0.25 )
+ ( low_frequency_noises.a ? 0.125 );
// define the base cloud shape by dilating it with the
// low?frequency FBM made of Worley noise.
float base_cloud = Remap ( low_frequency_noises.r , ?( 1.0 ? low_freq_FBM ) , 1 .0 , 0 .0 , 1 .0 );
// Get the density?height gradient using the density height
// function explained in Section 4.3.2.
float density_height_gradient = GetDensityHeightGradientForPoint ( p , weather_data );
// Apply the height function to the base cloud shape.
base_cloud ?= density_height_gradient ;
// Cloud coverage is stored in weather data’s red channel.
float cloud_coverage = weather_data.r;
// Use remap to apply the cloud coverage attribute.
float base_cloud_with_coverage = Remap ( base_cloud , cloud_coverage, 1. 0 , 0. 0 , 1.0);
// Multiply the result by the cloud coverage attribute so
// that smaller clouds are lighter and more aesthetically
// pleasing.
base_cloud_with_coverage ?= cloud_coverage;
// Add some turbulence to bottoms of clouds.
p.xy += curl_noise.xy ? ( 1 . 0 ? height_fraction );
// Sample high?frequency noises.
float3 high_frequency_noises = tex3Dlod ( Cloud3DNoiseTextureB , Cloud3DNoiseSamplerB , float4 ( p ? 0.1 , mip_level) ).rgb;
// Build?high frequency Worley noise FBM.
float high_freq_FBM = ( high_frequency_noises.r ? 0.625 )
+ ( high_frequency_noises.g ? 0.25 )
+ ( high_frequency_noises.b ? 0.125 );
// Get the height fraction for use with blending noise types
// over height.
float height_fraction = GetHeightFractionForPoint ( p , inCloudMinMax );
// Transition from wispy shapes to billowy shapes over height.
float high_freq_noise_modifier = mix ( high_freq_FBM ,
1 .0 ? high_freq_FBM , saturate ( height_fraction ? 10.0 ) );
// Erode the base cloud shape with the distorted
// high?frequency Worley noises.
float final_cloud = Remap ( base_cloud_with_coverage ,
high_freq_noise_modifier ? 0.2 , 1.0 , 0.0 , 1.0 );
return final_cloud;
}
Editor is loading...
Leave a Comment