определить уровень на уровне ширины - PullRequest
3 голосов
/ 06 мая 2011

Что именно делает функция 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, необходимый для выборки текущей позиции. Но в настоящее время объем шага выборки слишком велик ... хотя при уменьшении расстояния до камеры он уменьшается.

1 Ответ

0 голосов
/ 30 июня 2011

Есть много вещей, которые не так с тем, что вы делаете.

  • Почему бы не позволить gpu выбрать правильный уровень miplevel?Просто сделайте выборку на шаговой позиции.

  • Возможно, вы неправильно масштабируете.

  • Позвольте водителю серьезно выбрать правильный уровень для вас.

  • Подумайте о том, как работает трилинейная выборка.Затем подумайте о том, как это работает для томов.

  • fwidth не является правильным способом определения двухуровневого уровня, даже если вам нужен ближайший.

  • Разве я говорил, что GPU делает выбор на двух уровнях?

  • Ширина полезна для ускорения или замедления

...