diff --git a/files/materials/water.shader b/files/materials/water.shader index 08a19ace9..8f46aed34 100644 --- a/files/materials/water.shader +++ b/files/materials/water.shader @@ -118,7 +118,6 @@ #define WAVE_CHOPPYNESS 0.15 // wave choppyness #define WAVE_SCALE 75 // overall wave scale - #define ABBERATION 0.001 // chromatic abberation amount #define BUMP 1.5 // overall water surface bumpiness #define REFL_BUMP 0.08 // reflection distortion amount #define REFR_BUMP 0.06 // refraction distortion amount @@ -256,11 +255,15 @@ // refraction float3 R = reflect(vVec, normal); + + // check the depth at the refracted coords, and don't do any normal distortion for the refraction if the object to refract + // is actually above the water (objectDepth < waterDepth) + // this solves silhouettes around objects above the water + float refractDepth = shSample(depthMap, screenCoords-(shoreFade * normal.xz*REFR_BUMP)).x * far - depthPassthrough; + float doRefraction = (refractDepth < 0) ? 0.f : 1.f; float3 refraction = float3(0,0,0); - refraction.r = shSample(refractionMap, (screenCoords-(shoreFade * normal.xz*REFR_BUMP))*1.0).r; - refraction.g = shSample(refractionMap, (screenCoords-(shoreFade * normal.xz*REFR_BUMP))*1.0-(R.xy*ABBERATION)).g; - refraction.b = shSample(refractionMap, (screenCoords-(shoreFade * normal.xz*REFR_BUMP))*1.0-(R.xy*ABBERATION*2.0)).b; + refraction.rgb = shSample(refractionMap, (screenCoords-(shoreFade * normal.xz*REFR_BUMP * doRefraction))*1.0).rgb; // brighten up the refraction underwater refraction = (cameraPos.y < 0) ? shSaturate(refraction * 1.5) : refraction;