Странный артефакт OpenGL SSAO - PullRequest
0 голосов
/ 26 мая 2020

Пытаюсь реализовать SSAO в моем приложении OpenGL. Но придумал какой-то странный артефакт. Как я могу решить эту проблему с черным sh? Вот фрагментный шейдер для SSAO

"int KERNEL_MAX = 128;"
    "uniform vec3 kernel[128];"

    "uniform mat4 P;"
    "uniform sampler2D tex;"
    "uniform sampler2D texPos;"
    "uniform sampler2D texNormal;"
    "uniform sampler2D texDepth;"
    "uniform vec3 camPos;"

    "void main () {"

    "   vec4 pixel_color = texture2D(tex, v_uv);"
    "   vec3 pixel_pos = texture2D(texPos, v_uv).rgb;"
    "   vec3 pixel_normal = texture2D(texNormal, v_uv).rgb;"
    "   float pixel_depth = texture2D(texDepth, v_uv).r;"

    "   float occlusion = 0.0;"
    "   for (int i = 0; i < KERNEL_MAX; ++i) {"
    "       vec3 sample_ray = pixel_pos + kernel[i] * sign(dot(pixel_normal, kernel[i])) * 0.1;"
    "       vec4 sample_pos = (P * vec4(sample_ray, 1.0));"
    "       sample_pos.xy /= sample_pos.w;"
    "       sample_pos.xy = sample_pos.xy * 0.5 - 0.5;"

    "       float sample_depth = texture2D(texDepth, sample_pos.xy).r;"
    "       if (sample_depth < pixel_depth) { occlusion += 1.0; }"
    "   }"

enter image description here

1 Ответ

0 голосов
/ 26 мая 2020

Обычно используется смещение в алгоритмах Окружающая окклюзия экранного пространства :

const float bias = 0.0001;
if (sample_depth < pixel_depth - bias) { occlusion += 1.0; }
...