определить miplevel с fwidth

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


person fho    schedule 06.05.2011    source источник
comment
fwidth дает вам полный абсолютный дифференциал p. Поскольку общий дифференциал является скаляром, выражение 'vec3 width = fwidth(current_position_in_texture_space * size_of_texture);' без разницы. Я думаю, что это должно быть «ширина с плавающей запятой = длина (fwidth (current_position_in_texture_space) * size_of_texture);»   -  person datenwolf    schedule 06.05.2011


Ответы (1)


В том, что вы делаете, много неправильного.

  • Почему бы не позволить графическому процессору самому выбрать правильный мип-уровень? Просто сэмплируйте положение шага.

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

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

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

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

  • Я сказал, что пусть GPU делает выбор мип-уровня?

  • fwidth полезен для быстрого или медленного шага

person starmole    schedule 30.06.2011
comment
Проблема в том, что GPU не может определить miplevel для 3d сэмплирования. - person fho; 01.07.2011
comment
Конечно, может. Так же, как и в 2d: дискретная разница с соседями. Это было моей целью подумать о том, как работает сэмплирование. Вы неявно указываете miplevel вдоль вашего луча по размеру шага. - person starmole; 02.07.2011
comment
Я думал так же. может быть, это даже работает, но результаты этого были просто неправильными. - person fho; 10.07.2011