Почему я получаю эти зазубренные края в моем шейдере? - PullRequest
2 голосов
/ 28 мая 2019

Я написал простой шадертой пример пересечения лучевой плоскости.Я использую шаблон проверки на самолете, и я заметил странные артефакты.Я знаю, что в нем нет сглаживания, поэтому я полностью ожидал неровных линий.Однако по краям есть случайные пиксели, которые кажутся неправильными.Я изо всех сил старался воссоздать то же самое в Blender, используя средство рендеринга Cycles с 1 сэмплом на пиксель, и это дало результат, близкий к тому, что я ожидал.Кто-нибудь может объяснить это?

enter image description here

float intersect(in vec3 ro, in vec3 rd)
{
    return -ro.y / rd.y;
}

void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
    vec2 uv = ((fragCoord + vec2(0.5)) / iResolution.xy * 2.0 - 1.0) * vec2(16.0 / 9.0, 1.0);
    vec3 ro = vec3(0.0, 1.0, 0.0);
    vec3 rd = normalize(vec3(uv, 2.0));

    float t = intersect(ro, rd);

    vec3 col = vec3(0.0, 0.0, 0.0);

    if (t >= 0.0)
    { 
        vec3 pos = ro + t * rd;
        vec2 tex = floor(pos.xz);
        col = vec3(mod(tex.x + tex.y, 2.0));
    }

    fragColor = vec4(col, 1.0);
}

1 Ответ

1 голос
/ 28 мая 2019

Если линии сетки попадают непосредственно в точку выборки, то ошибка с плавающей точкой будет определять, какой квадрат сетки будет выбран для этого пикселя. Циклы используют случайные точки выборки, а вы используете целые числа (fragCoord + vec2(0.5)). Изменение точек выборки на fragCoord + vec2(0.001234, 0.004321) удаляет артефакты.

...