Можно задавать два критерия глубины поиска: максимальное кол-во делений на луче и дельту расстояния до поверхности от текущей позиции поиска. В 3D-случае можно дополнительно запоминать предыдущие текстурные координаты сэмпла и сравнивать их с новыми, если они лежат в пределах одного пикселя - дальше делить нет смысла. Для более точных и быстрых результатов желательно, чтобы исходный диапазон поиска был как можно меньшим. Для простоты я брал луч длиной чуть больше диаметра линзы. Скриншоты:
Глубина поиска - 5 шагов:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSTjP7ODjtBwqQIcHCA8r4BwLGi5rDCJwhreZvx3mPHfLeedrnHovtvIuX5V5HIIZWVkuHTRjOLAYB9taRqgdPeDSFw5FkaW7xuKo9OaYYifYQMNTTpL8upJYh8YdekafyTAFzZrMX8JqW/s400/bsearch_5s.png)
Видно, что найденные точки "пляшут" вокруг поверхности. При движении линзы неточности поиска видны ещё более явно.
7 шагов:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixy-WiTKA7181O5xwGV48riYvk-oEQKP6e8p3xdZ_TwJjqiwSeyuZDkzNGIB3YkAB5j8qvDgEr_Rrh3-1_BOf4-uN_44jRvB7F2FzJAU10e1OvfOL8fPPV5NAGqSHx_8lUGDPcueXy-3hE/s400/bsearch_7s.png)
12 шагов:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpoIBl1BINCfIQQ5jaBpN4vjaL7Mdna9fYU6edROM-2UxTIVZg5hKuwFdlAKZHi0q2OC6jb7G15Ij854QLIURZXVqtpyLvMDZH7dz8LwyDvRxPGOrr9aWFAb1aljbkRC5WMNQhh6zXydP-/s400/bsearch_12s.png)
Как бы то ни было, основная задача - попиксельная точность пересечения луча с backfaced геометрией. Вообще, как я считаю, в задаче real-time refraction главным является предельная точность и аккуратная обработка результатов, внимание к мелочам, что поможет создать правдоподобную иллюзию объёма и искажения, а не очередную поделку "на шейдерах".
Комментариев нет:
Отправить комментарий