Что именно делает функция GLSL fwidth (p)?
Я знаю, что это реализовано как:
fwidth(p) = abs(dfdx(p)) + abs(dfdy(p))
но я не уверен, что получил его еще.
Я делаю некоторые базовые трансляции лучей здесь и пытаюсь вычислить необходимый уровень. Чтобы найти miplevel, вызовите fwidth по координате, где луч достигает объема (в текстурном пространстве).
// get 'derivate width' of sampling position
vec3 width = fwidth(current_position_in_texture_space * size_of_texture);
// get radius around current position in voxels
float range = length(width);
// calculate factor for interpolation (see below)
float factor = range / distance_from_camera_to_current_position;
В моем понимании GLSL синхронизирует все потоки и вычисляет производные с верхним и правым соседними потоками.
Во время обхода я интерполирую линейный диапазон:
// during traversal
float new_range = distance_from_camera_to_current_position * factor;
// calculate mip level from voxel range
float level = log2(new_range);
// get new sampling stepsize
float stepsize = new_range * 0.5;
Если это правильный уровень, то должен быть уровень mip, необходимый для выборки текущей позиции. Но в настоящее время объем шага выборки слишком велик ... хотя при уменьшении расстояния до камеры он уменьшается.