#glsl #raymarching
Вопрос:
В следующей shadertoy я иллюстрирую артефакт, который возникает при raymarching
https://www.shadertoy.com/view/stdGDl
Это моя «сцена» (см. Фрагмент кода ниже). Он отображает примитивный «tunnel_fragment», который является SDF (функцией расстояния со знаком), и использует по модулю от координат для вычисления «бесконечных» повторений этих фрагментов. Затем он также вычисляет, на каком диске мы находимся (нечетный / четный), чтобы сместить их.
Я действительно не понимаю, почему эти артефакты возникают, когда диски (или кольца -> см. tunnel_fragment, если вы удалите комментарий, они станут кольцами вместо дисков) представляют эти артефакты, когда альтернативное движение в направлении x становится большим.
Эти артефакты не появляются, когда структура диска перемещается вправо в целом, они появляются только тогда, когда диски чередуются и вся структура становится более сложной.
Что я делаю не так? Это действительно поражает меня.
vec2 scene(in vec3 p)
{
float thick = 0.1;
vec3 cp = p;
// Use modulo to simulate inf disks
vec3 c = vec3(0,0,6.0*thick);
vec3 q = mod(cp 0.5*c,c)-0.5*c;
// Find index of the disk
vec3 disk = (cp 0.5*c) / (c);
float idx = floor(disk.z);
// Do something simple with odd/even disks
// Note: changing this shows the artefacts are always there
if(mod(idx,2.0) == 0.0) {
q.x = sin(disk.z*t)*t*t;
} else {
q.x -= sin(disk.z*t)*t*t;
}
float d = tunnel_fragment(q, vec3(0.0), vec3(0.0, 0.0, 1.0), 2.0, thick, 0.2);
return vec2(d, idx);
}
Ответ №1:
Проблема проиллюстрирована на этой диаграмме:
Когда текущий диск (по модулю) смещен больше, чем расстояние между дисками, вычисляемое расстояние больше, чем расстояние до следующего диска. Следовательно, вы рискуете пропустить следующий диск.
Чтобы решить эту проблему, вам нужно либо ограничить смещение (как сказано — не более расстояния между дисками), либо выбрать нечетные / четные диски отдельно и min()
между ними.
Комментарии:
1. Я должен был догадаться об этом, спасибо, что показал путь к просветлению.