a6015e1411410ae537dee6a068c3f34125ae8b8a
In Cycles, the convention is that reflection vs. refraction are classified based on the hemisphere defined by the *shading* normal (N). In general, most closure code uses the shading normal for most operations, as is expected since using the geometric normal (Ng) would break normal maps and smooth shading. However, there are two places that use Ng: On the one hand, BSDF sampling functions generally reject reflections that fall below the Ng hemisphere, since they'd intersect the geometry when tracing the bounce. This is required, and we can't do much about it. On the other hand, the Microfacet evaluation code also checked that the ray is in the same hemisphere w.r.t. both shading and geometric normal. Theoretically, this is the right thing to do, since sampling and evaluation code are supposed to be consistent. However, doing so breaks smooth shading, since now direct light evaluation near the terminator will sometimes be rejected. This didn't cause problems in practice because of another inconsistency: While the parameter of the eval functions was named Ng, the caller actually provided N (unclear whether by mistake or as a hacky workaround to the terminator). When this was fixed in063a9e89, users quickly reported issues with the shadow terminator, so it was reverted to the hacky inconsistency in1c50dd8b. So, let's clean this mess up properly. If we don't want to do the Ng hemisphere check in _eval, then instead of passing in a misleading value that ends up making it a no-op, just remove the check. After all, the other closures don't perform it either. This way, we avoid the mislabeled Ng, we get rid of the special case for microfacets, and the shadow terminator continues to be fine. Technically, we still have the _sample vs. _eval mismatch. However, this is just unavoidable, and is irrelevant in practice: For a strongly directional light that makes the shadow terminator noticeable, the MIS weights will be massively in favor of eval, to the point that it doesn't really matter what sample does. To support this argument: You can actually reproduce a broken shadow terminator in pretty much every Cycles version going back to 2011 by just setting up a small intense mesh emitter, turning off MIS on it to disable _eval, and then rendering a diffuse smooth-shaded sphere with >100000 samples so that the fireflies resolve into somewhat consistent lighting. If nobody has complained about this affecting all closures for 11 years, I guess it's fine. Pull Request: https://projects.blender.org/blender/blender/pulls/138632
…
Blender
Blender is the free and open source 3D creation suite. It supports the entirety of the 3D pipeline—modeling, rigging, animation, simulation, rendering, compositing, motion tracking and video editing.
Project Pages
Development
License
Blender as a whole is licensed under the GNU General Public License, Version 3. Individual files may have a different but compatible license.
See blender.org/about/license for details.
Description
Languages
C++
78%
Python
14.9%
C
2.9%
GLSL
1.9%
CMake
1.2%
Other
0.9%
