Cycles: Overhaul ensure_valid_reflection to fix issues with normal- and bumpmapping
authorLukas Stockner <lukas.stockner@freenet.de>
Sun, 21 Oct 2018 01:41:31 +0000 (03:41 +0200)
committerLukas Stockner <lukas.stockner@freenet.de>
Thu, 25 Oct 2018 12:50:48 +0000 (14:50 +0200)
commit65b25df8018cdef8952d2e49ad66f55c6b0b3e2b
treeaa9a3880e81f37fd7d0a8071681653d67b532c91
parent2046817c080340d45c4297d2be9799df551b0805
Cycles: Overhaul ensure_valid_reflection to fix issues with normal- and bumpmapping

This function is supposed to prevent the black artifacts caused by strong normal- or bumpmapping, but failed in some cases.

Now the code correctly handles all test files and previous issues I am aware of and also has extensive comments describing
the algorithm and the math behind it.

Basically, the main problem was that there can be multiple valid solutions that fulfil the reflection angle criterium,
but I had assumed that only one would exist and therefore simply picked the first solution with a positive term in srqt().
Now, the code uses additional validity checks and a simple heuristic to pick the best valid solution.

Additionally, the code messed up very shallow reflections even if the normal map strength was zero due to the constant
limit for the outgoing ray angle, which caused shallow incoming rays to fail the initial test even when reflected directly
on Ng. Now, the code accounts for this by reducing the threshold in the case of a shallow incoming ray, ensuring that at
least N=Ng is always a valid solution.

Reviewers: brecht

Differential Revision: https://developer.blender.org/D3816
intern/cycles/kernel/kernel_montecarlo.h
intern/cycles/kernel/shaders/stdosl.h