Что именно делает функция GLSL fwidth(p)?
Я знаю, что это реализовано как:
fwidth(p) = abs(dfdx(p)) + abs(dfdy(p))
но я не уверен, получил ли я это еще.
Здесь я делаю базовый рейкастинг и пытаюсь рассчитать требуемый мип-уровень. Чтобы найти мип-уровень, нужно вызвать 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, который требуется для выборки текущей позиции. Но в настоящее время размер шага выборки громкости слишком велик ... хотя он уменьшается, если расстояние до камеры уменьшается.