Skip to content

Commit 6c0da1d

Browse files
authored
Merge pull request #35 from martinRenou/workaround_normals
Water: Workaround wrong normals
2 parents 2eea2ff + c1bc2ab commit 6c0da1d

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

src/Effects/Water/Water.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,13 @@ class Water extends Effect {
116116
vec2 currentPosition = projectedWaterPosition.xy;
117117
vec2 coords = 0.5 + 0.5 * currentPosition;
118118
119-
vec3 refracted = refract(light, normal, eta);
119+
// Workaround wrong normal
120+
vec3 norm = normal;
121+
if (dot(light, normal) > 0.) {
122+
norm = - normal;
123+
}
124+
125+
vec3 refracted = refract(light, norm, eta);
120126
vec4 projectedRefractionVector = projectionMatrix * viewMatrix * vec4(refracted, 1.);
121127
122128
vec3 refractedDirection = projectedRefractionVector.xyz;
@@ -239,10 +245,17 @@ class Water extends Effect {
239245
vec3 wPosition = (modelMatrix * vec4(position, 1.)).xyz;
240246
241247
vec3 eye = normalize(wPosition - cameraPosition);
242-
vec3 refracted = normalize(refract(eye, normal, eta));
243-
reflected = normalize(reflect(eye, normal));
244248
245-
reflectionFactor = fresnelBias + fresnelScale * pow(1. + dot(eye, normal), fresnelPower);
249+
// Workaround wrong normal
250+
vec3 norm = normal;
251+
if (dot(eye, normal) > 0.) {
252+
norm = - normal;
253+
}
254+
255+
vec3 refracted = normalize(refract(eye, norm, eta));
256+
reflected = normalize(reflect(eye, norm));
257+
258+
reflectionFactor = fresnelBias + fresnelScale * pow(1. + dot(eye, norm), fresnelPower);
246259
247260
vec4 projectedRefractedPosition = projectionMatrix * modelViewMatrix * vec4(position + refractionFactor * refracted, 1.0);
248261
refractedPosition = projectedRefractedPosition.xy / projectedRefractedPosition.w;

0 commit comments

Comments
 (0)