diff --git a/Shaders/world_pass/world_pass.frag.glsl b/Shaders/world_pass/world_pass.frag.glsl index 5ebe6ae8..d69e8bc6 100644 --- a/Shaders/world_pass/world_pass.frag.glsl +++ b/Shaders/world_pass/world_pass.frag.glsl @@ -81,28 +81,28 @@ float sampleCloudDensity(vec3 p) { } vec3 traceClouds(vec3 sky, vec3 dir) { - const int steps = 24; - const float step_size = 0.5 / float(steps); + const float step_size = 0.5 / float(cloudsSteps); float T = 1.0; - vec4 C = vec4(0.0); - vec2 uv = dir.xy / dir.z * 0.4 + cloudsWind * time * 0.1; + float C = 0.0; + float A = 0.0; + vec2 uv = dir.xy / dir.z * 0.4 * cloudsLower + cloudsWind * time * 0.02; - for (int i = 0; i < steps; ++i) { - float h = float(i) / float(steps); + for (int i = 0; i < cloudsSteps; ++i) { + float h = float(i) / float(cloudsSteps); float d = sampleCloudDensity(vec3(uv * 0.04, h)); float Ti = exp(-d * step_size); - C.a += (1.0 - Ti) * (1.0 - C.a); + A += (1.0 - Ti) * (1.0 - A); if (d > 0) { T *= Ti; if (T < 0.01) break; - C.rgb += T * exp(h) * d * step_size * 0.6; + C += T * exp(h) * d * step_size * 0.6 * cloudsPrecipitation; } - if (C.a > 1.0) break; - uv += (dir.xy / dir.z) * step_size; + if (A > 1.0) break; + uv += (dir.xy / dir.z) * step_size * cloudsUpper; } - C.a = clamp(C.a, 0.00001, 1); - return mix(sky, C.rgb / C.a, C.a); + A = clamp(A, 0.00001, 1); + return mix(sky, vec3(C) / A, A); } #endif // _EnvClouds diff --git a/blender/arm/props_renderpath.py b/blender/arm/props_renderpath.py index 5acc07c5..15c31edf 100644 --- a/blender/arm/props_renderpath.py +++ b/blender/arm/props_renderpath.py @@ -399,14 +399,12 @@ class ArmRPListItem(bpy.types.PropertyGroup): arm_voxelgi_range: FloatProperty(name="Range", description="Maximum range", default=2.0, update=assets.invalidate_shader_cache) arm_voxelgi_aperture: FloatProperty(name="Aperture", description="Cone aperture for shadow trace", default=1.0, update=assets.invalidate_shader_cache) arm_sss_width: FloatProperty(name="Width", description="SSS blur strength", default=1.0, update=assets.invalidate_shader_cache) - arm_clouds_density: FloatProperty(name="Density", default=1.0, min=0.0, max=1.0, update=assets.invalidate_shader_cache) - arm_clouds_size: FloatProperty(name="Size", default=1.0, min=0.0, max=10.0, update=assets.invalidate_shader_cache) - arm_clouds_lower: FloatProperty(name="Lower", default=2.0, min=1.0, max=10.0, update=assets.invalidate_shader_cache) - arm_clouds_upper: FloatProperty(name="Upper", default=3.5, min=1.0, max=10.0, update=assets.invalidate_shader_cache) - arm_clouds_wind: FloatVectorProperty(name="Wind", default=[0.2, 0.06], size=2, update=assets.invalidate_shader_cache) - arm_clouds_secondary: FloatProperty(name="Secondary", default=0.0, min=0.0, max=10.0, update=assets.invalidate_shader_cache) - arm_clouds_precipitation: FloatProperty(name="Precipitation", default=1.0, min=0.0, max=2.0, update=assets.invalidate_shader_cache) - arm_clouds_eccentricity: FloatProperty(name="Eccentricity", default=0.6, min=0.0, max=1.0, update=assets.invalidate_shader_cache) + arm_clouds_lower: FloatProperty(name="Lower", default=1.0, min=0.1, max=10.0, update=assets.invalidate_shader_cache) + arm_clouds_upper: FloatProperty(name="Upper", default=1.0, min=0.1, max=10.0, update=assets.invalidate_shader_cache) + arm_clouds_wind: FloatVectorProperty(name="Wind", default=[1.0, 0.0], size=2, update=assets.invalidate_shader_cache) + arm_clouds_secondary: FloatProperty(name="Secondary", default=1.0, min=0.1, max=10.0, update=assets.invalidate_shader_cache) + arm_clouds_precipitation: FloatProperty(name="Precipitation", default=1.0, min=0.1, max=10.0, update=assets.invalidate_shader_cache) + arm_clouds_steps: IntProperty(name="Steps", default=24, min=1, max=240, update=assets.invalidate_shader_cache) arm_ocean_base_color: FloatVectorProperty(name="Base Color", size=3, default=[0.1, 0.19, 0.37], subtype='COLOR', min=0, max=1, update=assets.invalidate_shader_cache) arm_ocean_water_color: FloatVectorProperty(name="Water Color", size=3, default=[0.6, 0.7, 0.9], subtype='COLOR', min=0, max=1, update=assets.invalidate_shader_cache) arm_ocean_level: FloatProperty(name="Level", default=0.0, update=assets.invalidate_shader_cache) diff --git a/blender/arm/props_ui.py b/blender/arm/props_ui.py index 74c787ff..dd817258 100644 --- a/blender/arm/props_ui.py +++ b/blender/arm/props_ui.py @@ -880,14 +880,12 @@ class ARM_PT_RenderPathWorldPanel(bpy.types.Panel): layout.prop(rpdat, 'arm_clouds') col = layout.column() col.enabled = rpdat.arm_clouds - col.prop(rpdat, 'arm_clouds_density') - col.prop(rpdat, 'arm_clouds_size') col.prop(rpdat, 'arm_clouds_lower') col.prop(rpdat, 'arm_clouds_upper') col.prop(rpdat, 'arm_clouds_precipitation') - col.prop(rpdat, 'arm_clouds_eccentricity') col.prop(rpdat, 'arm_clouds_secondary') col.prop(rpdat, 'arm_clouds_wind') + col.prop(rpdat, 'arm_clouds_steps') layout.prop(rpdat, "rp_ocean") col = layout.column() col.enabled = rpdat.rp_ocean diff --git a/blender/arm/write_data.py b/blender/arm/write_data.py index a0290971..b59dd449 100755 --- a/blender/arm/write_data.py +++ b/blender/arm/write_data.py @@ -455,14 +455,12 @@ const int shadowmapCascades = """ + str(rpdat.rp_shadowmap_cascades) + """; """) if rpdat.arm_clouds: f.write( -"""const float cloudsDensity = """ + str(round(rpdat.arm_clouds_density * 100) / 100) + """; -const float cloudsSize = """ + str(round(rpdat.arm_clouds_size * 100) / 100) + """; -const float cloudsLower = """ + str(round(rpdat.arm_clouds_lower * 1000)) + """; -const float cloudsUpper = """ + str(round(rpdat.arm_clouds_upper * 1000)) + """; -const vec2 cloudsWind = vec2(""" + str(round(rpdat.arm_clouds_wind[0] * 1000) / 1000) + """, """ + str(round(rpdat.arm_clouds_wind[1] * 1000) / 1000) + """); -const float cloudsSecondary = """ + str(round(rpdat.arm_clouds_secondary * 100) / 100) + """; +"""const float cloudsLower = """ + str(round(rpdat.arm_clouds_lower * 100) / 100) + """; +const float cloudsUpper = """ + str(round(rpdat.arm_clouds_upper * 100) / 100) + """; +const vec2 cloudsWind = vec2(""" + str(round(rpdat.arm_clouds_wind[0] * 100) / 100) + """, """ + str(round(rpdat.arm_clouds_wind[1] * 100) / 100) + """); const float cloudsPrecipitation = """ + str(round(rpdat.arm_clouds_precipitation * 100) / 100) + """; -const float cloudsEccentricity = """ + str(round(rpdat.arm_clouds_eccentricity * 100) / 100) + """; +const float cloudsSecondary = """ + str(round(rpdat.arm_clouds_secondary * 100) / 100) + """; +const int cloudsSteps = """ + str(rpdat.arm_clouds_steps) + """; """) if rpdat.rp_ocean: f.write(