Искажения изображения в ray marching-е

Я пытался написать программу, занимающуюся ray marching-ом, но в определенный момент заметил, что в некоторых местах стали появляться непонятные искажения изображения. Код и результат его выполнения вы можете посмотреть здесь: https://www.shadertoy.com/view/wdBBzt (модель можно врящать мышью). Должен рисоваться куб, из которого вырезаны 7 меньших кубов (1 в центре и по 1-му на каждой грани), но в местах выреза изображение выглядит странно. Из-за чего могли образоваться искажения?


Ответы (1 шт):

Автор решения: Stranger in the Q

Внутри функции map() Вы умножили положение, для которого ищете значение функции sdf, таким образом Вы исказили пространство в этом месте, т.е. нашли значение для другой точки

float d3 = sdcross(p * 3.0);
d = max(d, -d3);

Я бы рекомендовал не искажать пространство, а изменить функцию, которой вы вычитаете объем:

float sdbox2d(in vec2 p) {
    vec2 d = abs(p) - .33;  // вот тут я поменял 1 на 0.33
    return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
}

https://www.shadertoy.com/view/wdBBRd

введите сюда описание изображения

→ Ссылка