-
-
Notifications
You must be signed in to change notification settings - Fork 36.1k
Description
Description of the problem
I guess it may not be just a threejs issue but I ran into a problem when using a normal map with a mesh having mirrored uvs.
With the current code, my understanding is that the RGB value (128, 128, 255) which is supposed to represent a non perturbed normal by convention is read as (0.50196, 0.50196, 1.0) - in linear color space. When converted to [-1, 1] using the function map * 2.0 - 1.0 the vector encoded in the texture becomes (0.00392, 0.00392, 1.0) when it shall be (0.0, 0.0, 1.0). This is the reason why when using a mesh with mirrored uvs and a normal texture, the two normals at a seam have different directions creating the artifact.
It can be easily proven by modifying the perturbNormal2Arb function.
Replace vec3 mapN = map * 2.0 - 1.0; by vec3 mapN = map * 2.0 - 1.00392; and the seams disappear. I attached two screenshots made using a fully metallic material and no roughness to make it very obvious:
Not too sure how this problem is generally solved as this is not my area of expertise.
Three.js version
- Dev
- r113
Browser
- All of them
OS
- All of them

