Реализовал поиск пересечения с backfaced поверхностью через двоичный поиск.
Можно задавать два критерия глубины поиска: максимальное кол-во делений на луче и дельту расстояния до поверхности от текущей позиции поиска. В 3D-случае можно дополнительно запоминать предыдущие текстурные координаты сэмпла и сравнивать их с новыми, если они лежат в пределах одного пикселя - дальше делить нет смысла. Для более точных и быстрых результатов желательно, чтобы исходный диапазон поиска был как можно меньшим. Для простоты я брал луч длиной чуть больше диаметра линзы. Скриншоты:
Глубина поиска - 5 шагов:
Видно, что найденные точки "пляшут" вокруг поверхности. При движении линзы неточности поиска видны ещё более явно.
7 шагов:Уже лучше, но при движении заметно "дрожание" точек.
12 шагов:
Начиная с 10 шагов, поиск становится почти точным. Нужно понимать, что кол-во шагов для каждого луча - это кол-во выборок из depth-текстуры для каждого обрабатываемого фрагмента в 3D-случае. Большое кол-во выборок на пиксель создаёт большую нагрузку при увеличении разрешения, поэтому важно делать их как можно меньше. Можно применять комбинацию последовательного поиска с последующим уточнением двоичным, но при малых величинах (~10) выигрыш сомнителен. В случае с линзой проще за начало луча брать не его пересечение с лицевой поверхностью, а позицию на преломлённом луче, отодвинутую от начала на 1/2-1/3 диаметра линзы - можно сэкономить пару шагов при двоичном поиске.
Как бы то ни было, основная задача - попиксельная точность пересечения луча с backfaced геометрией. Вообще, как я считаю, в задаче real-time refraction главным является предельная точность и аккуратная обработка результатов, внимание к мелочам, что поможет создать правдоподобную иллюзию объёма и искажения, а не очередную поделку "на шейдерах".
среда, 14 октября 2009 г.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий