@@ -116,7 +116,13 @@ class Water extends Effect {
116
116
vec2 currentPosition = projectedWaterPosition.xy;
117
117
vec2 coords = 0.5 + 0.5 * currentPosition;
118
118
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);
120
126
vec4 projectedRefractionVector = projectionMatrix * viewMatrix * vec4(refracted, 1.);
121
127
122
128
vec3 refractedDirection = projectedRefractionVector.xyz;
@@ -239,10 +245,17 @@ class Water extends Effect {
239
245
vec3 wPosition = (modelMatrix * vec4(position, 1.)).xyz;
240
246
241
247
vec3 eye = normalize(wPosition - cameraPosition);
242
- vec3 refracted = normalize(refract(eye, normal, eta));
243
- reflected = normalize(reflect(eye, normal));
244
248
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);
246
259
247
260
vec4 projectedRefractedPosition = projectionMatrix * modelViewMatrix * vec4(position + refractionFactor * refracted, 1.0);
248
261
refractedPosition = projectedRefractedPosition.xy / projectedRefractedPosition.w;
0 commit comments