пятница, 13 ноября 2009 г.

О всяком

Реализовал двусторонние преломления с использованием двоичного поиска по буферу глубины, как я и хотел ещё летом. Для референса использовал трансформации в world space и линейный двоичный поиск, затем реализовал non-linear binary search in texture space. Функция получилась весьма эффективной, цикл занимает 14 инструкций, conservative - чуть больше. Последний я пока не использую, т. к. для выпуклых линз он необязателен. Вообще binary search штука замечательная, очень быстро сходится в нужной точке, а с float depth buffer так вообще сказка. С реализацией пришлось повозиться, конечно, зато теперь я уверен, что трёхмерный вариант работает аналогично тестовым двумерным. Полноэкранный шейдер на моей колымаге ковыляет со скоростью ~ 30 fps.

Скрины пока не выкладываю, надо полировать. Теперь думаю поместить внутрь линзы произвольный меш. Стоимость поиска увеличивается, конечно, т. к. теперь надо "перекапывать" два буфера глубины - один линзы, другой - меша.

Вчера пришла идея, как реализовать антиалиазинг при рэйтрейсинге (зачем мне этот антиалиазинг? - ну не могу я смотреть на эти лесенки!). Рендер в более высокое разрешение с последующим резолвом не годится - скорость. Но можно попробовать использовать тот факт, что наши рёбра - процедурные. Ведь сглаживают же процедурные текстуры (зебра, chekerboard) с помощью производных. Есть идея попробовать использовать барицентрические координаты для определения coverage пикселя. Рассмотрим процедуру рисования. Берём центр пикселя (или любое другое положение в пикселе, неважно, главное, чтобы оно было одинаковым для всех пикселей), это начало нашего луча. Ребро нашего треугольника - идеальный отрезок, алиазинг же происходит из-за двоичной природы теста на пересечение - луч попал/не попал. Очень часто может быть так, что треугольник покрывает часть пикселя, но центр пикселя не попадает в треугольник - не закрашиваем. А надо бы. Идея проста - смотрим, насколько далеко центр пикселя от ребра треугольника, и каким-то образом рассчитываем на основе этого coverage. А дальше, на основе coverage, смешиваем цвет на границе треугольника с цветом в буфере. Мне почему-то кажется, что это сработает. Я ещё покопаю сабж по процедурному сглаживанию и для пробы создам простую CPU реализацию.

Посмотрел "Письма с Иводзимы" Клинта Иствуда. Мораль такова: "Ты должен умереть за императора, и ниипёт".

Комментариев нет:

Отправить комментарий