Optimize fog material calculations and parameters

This commit is contained in:
2026-04-07 11:32:21 +02:00
parent 4238bce5f5
commit 1b16aacf93
2 changed files with 26 additions and 50 deletions

View File

@@ -39,11 +39,7 @@ export function createFogQualityMaterial(options) {
varying vec3 vLocalPosition;
#include <fog_pars_fragment>
#define FOG_STEPS 18
float saturate(float value) {
return clamp(value, 0.0, 1.0);
}
#define FOG_STEPS 10
float hash13(vec3 point) {
point = fract(point * 0.1031);
@@ -78,9 +74,9 @@ export function createFogQualityMaterial(options) {
float value = 0.0;
float amplitude = 0.5;
for (int octave = 0; octave < 4; octave += 1) {
for (int octave = 0; octave < 3; octave += 1) {
value += amplitude * noise3(point);
point = point * 2.02 + vec3(17.1, 31.7, 9.2);
point = point * 2.04 + vec3(17.1, 31.7, 9.2);
amplitude *= 0.5;
}
@@ -123,22 +119,14 @@ export function createFogQualityMaterial(options) {
return 0.0;
}
vec3 drift = vec3(time * 0.12, time * 0.05, -time * 0.08);
vec3 warpSource = samplePosition * 0.65 + drift;
vec3 warp = vec3(
fbm(warpSource + vec3(13.1, 0.0, 0.0)),
fbm(warpSource + vec3(0.0, 7.9, 0.0)),
fbm(warpSource + vec3(0.0, 0.0, 19.7))
) - 0.5;
vec3 cloudPosition = samplePosition + warp * (0.7 + shape * 0.5);
float primary = fbm(cloudPosition * 0.78 + drift);
float secondary = fbm(cloudPosition * 1.56 - drift * 1.35);
float wisps = fbm(cloudPosition * 2.35 + vec3(0.0, time * 0.09, 0.0));
float cloud = smoothstep(0.28, 0.94, mix(primary, secondary, 0.45) + wisps * 0.18);
vec3 drift = vec3(time * 0.1, time * 0.04, -time * 0.065);
float primary = fbm(samplePosition * 0.58 + drift);
float secondary = fbm(samplePosition * 1.18 - drift * 1.45 + vec3(4.3, 9.7, 2.1));
float wisps = noise3(samplePosition * 2.15 + vec3(0.0, time * 0.08, 0.0));
float cloud = smoothstep(0.34, 0.92, primary * 0.68 + secondary * 0.24 + wisps * 0.08);
float centerBias = 1.0 - smoothstep(0.18, 1.08, length(normalizedPosition * vec3(1.05, 0.92, 1.05)));
float verticalBias = mix(0.9, 1.08, smoothstep(-0.75, 0.35, normalizedPosition.y));
float carvedCloud = mix(0.35, 1.1, cloud) * mix(0.72, 1.0, centerBias);
float carvedCloud = mix(0.42, 1.04, cloud) * mix(0.72, 1.0, centerBias);
return volumeFogDensity * shape * carvedCloud * verticalBias;
}
@@ -169,13 +157,13 @@ export function createFogQualityMaterial(options) {
}
vec3 normalizedPosition = samplePosition / max(volumeHalfSize, vec3(1e-3));
float forwardScatter = pow(1.0 - abs(dot(rayDirection, normalize(samplePosition + vec3(1e-3, 2e-3, -1e-3)))), 2.0);
float forwardScatter = 1.0 - abs(dot(rayDirection, normalize(samplePosition + vec3(1e-3, 2e-3, -1e-3))));
float topLight = smoothstep(-0.2, 0.95, normalizedPosition.y);
float coolShadow = smoothstep(0.15, 0.9, fbm(samplePosition * 0.92 - vec3(time * 0.11, 0.0, time * 0.06)));
vec3 sampleColor = mix(volumeFogColor * 0.74, vec3(1.0), 0.08 + topLight * 0.12 + forwardScatter * 0.18);
float coolShadow = smoothstep(0.18, 0.88, noise3(samplePosition * 0.88 - vec3(time * 0.08, 0.0, time * 0.05)));
vec3 sampleColor = mix(volumeFogColor * 0.76, vec3(1.0), 0.06 + topLight * 0.12 + forwardScatter * 0.12);
sampleColor = mix(sampleColor * 0.92, sampleColor, coolShadow);
float extinction = sampleDensity * stepLength * 1.65;
float extinction = sampleDensity * stepLength * 1.5;
float sampleAlpha = 1.0 - exp(-extinction);
accumulatedColor += transmittance * sampleColor * sampleAlpha;
transmittance *= 1.0 - sampleAlpha;

View File

@@ -67,11 +67,7 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
varying vec3 vLocalPosition;
#include <fog_pars_fragment>
#define FOG_STEPS 18
float saturate(float value) {
return clamp(value, 0.0, 1.0);
}
#define FOG_STEPS 10
float hash13(vec3 point) {
point = fract(point * 0.1031);
@@ -106,9 +102,9 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
float value = 0.0;
float amplitude = 0.5;
for (int octave = 0; octave < 4; octave += 1) {
for (int octave = 0; octave < 3; octave += 1) {
value += amplitude * noise3(point);
point = point * 2.02 + vec3(17.1, 31.7, 9.2);
point = point * 2.04 + vec3(17.1, 31.7, 9.2);
amplitude *= 0.5;
}
@@ -151,22 +147,14 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
return 0.0;
}
vec3 drift = vec3(time * 0.12, time * 0.05, -time * 0.08);
vec3 warpSource = samplePosition * 0.65 + drift;
vec3 warp = vec3(
fbm(warpSource + vec3(13.1, 0.0, 0.0)),
fbm(warpSource + vec3(0.0, 7.9, 0.0)),
fbm(warpSource + vec3(0.0, 0.0, 19.7))
) - 0.5;
vec3 cloudPosition = samplePosition + warp * (0.7 + shape * 0.5);
float primary = fbm(cloudPosition * 0.78 + drift);
float secondary = fbm(cloudPosition * 1.56 - drift * 1.35);
float wisps = fbm(cloudPosition * 2.35 + vec3(0.0, time * 0.09, 0.0));
float cloud = smoothstep(0.28, 0.94, mix(primary, secondary, 0.45) + wisps * 0.18);
vec3 drift = vec3(time * 0.1, time * 0.04, -time * 0.065);
float primary = fbm(samplePosition * 0.58 + drift);
float secondary = fbm(samplePosition * 1.18 - drift * 1.45 + vec3(4.3, 9.7, 2.1));
float wisps = noise3(samplePosition * 2.15 + vec3(0.0, time * 0.08, 0.0));
float cloud = smoothstep(0.34, 0.92, primary * 0.68 + secondary * 0.24 + wisps * 0.08);
float centerBias = 1.0 - smoothstep(0.18, 1.08, length(normalizedPosition * vec3(1.05, 0.92, 1.05)));
float verticalBias = mix(0.9, 1.08, smoothstep(-0.75, 0.35, normalizedPosition.y));
float carvedCloud = mix(0.35, 1.1, cloud) * mix(0.72, 1.0, centerBias);
float carvedCloud = mix(0.42, 1.04, cloud) * mix(0.72, 1.0, centerBias);
return volumeFogDensity * shape * carvedCloud * verticalBias;
}
@@ -197,13 +185,13 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
}
vec3 normalizedPosition = samplePosition / max(volumeHalfSize, vec3(1e-3));
float forwardScatter = pow(1.0 - abs(dot(rayDirection, normalize(samplePosition + vec3(1e-3, 2e-3, -1e-3)))), 2.0);
float topLight = smoothstep(-0.2, 0.95, normalizedPosition.y);
float coolShadow = smoothstep(0.15, 0.9, fbm(samplePosition * 0.92 - vec3(time * 0.11, 0.0, time * 0.06)));
vec3 sampleColor = mix(volumeFogColor * 0.74, vec3(1.0), 0.08 + topLight * 0.12 + forwardScatter * 0.18);
float forwardScatter = 1.0 - abs(dot(rayDirection, normalize(samplePosition + vec3(1e-3, 2e-3, -1e-3))));
float coolShadow = smoothstep(0.18, 0.88, noise3(samplePosition * 0.88 - vec3(time * 0.08, 0.0, time * 0.05)));
vec3 sampleColor = mix(volumeFogColor * 0.76, vec3(1.0), 0.06 + topLight * 0.12 + forwardScatter * 0.12);
sampleColor = mix(sampleColor * 0.92, sampleColor, coolShadow);
float extinction = sampleDensity * stepLength * 1.65;
float extinction = sampleDensity * stepLength * 1.5;
float sampleAlpha = 1.0 - exp(-extinction);
accumulatedColor += transmittance * sampleColor * sampleAlpha;
transmittance *= 1.0 - sampleAlpha;