Pure Depth SSAO мерцает

Я пытаюсь внедрить Pure Depth SSAO, используя это руководство, в движок OpenGL ES 2.0. . Теперь я испытываю мерцание, которое выглядит так, как будто я читал откуда-то, где у меня нет данных. Вы видите, где я допустил ошибку, или у вас есть идея, как решить проблему мерцания? Мне нужно, чтобы это работало на мобильных устройствах и html5 с упреждающим рендерингом, поэтому я использую версию SSAO только для глубины. Большое спасибо

Видео: YouTube

GLSL-код:

uniform sampler2D texture0;
uniform sampler2D texture1;

varying vec2 uvVarying;

vec3 GetNormalFromDepth(float depth, vec2 uv);

uniform mediump vec2 agk_resolution;
uniform float ssaoStrength;
uniform float ssaoBase;
uniform float ssaoArea;
uniform float ssaoFalloff;
uniform float ssaoRadius;

const int samples = 16;
vec3 sampleSphere[samples];

void main()
{
    highp float depth = texture2D(texture0, uvVarying).r;
    vec3 random = normalize( texture2D(texture1, uvVarying * agk_resolution / 64.0).rgb );

    vec3 position = vec3(uvVarying, depth);
    vec3 normal = GetNormalFromDepth(depth, uvVarying);

    sampleSphere[0] = vec3( 0.5381, 0.1856,-0.4319);
    sampleSphere[1] = vec3( 0.1379, 0.2486, 0.4430);
    sampleSphere[2] = vec3( 0.3371, 0.5679,-0.0057);
    sampleSphere[3] = vec3(-0.6999,-0.0451,-0.0019);
    sampleSphere[3] = vec3( 0.0689,-0.1598,-0.8547);
    sampleSphere[5] = vec3( 0.0560, 0.0069,-0.1843);
    sampleSphere[6] = vec3(-0.0146, 0.1402, 0.0762);
    sampleSphere[7] = vec3( 0.0100,-0.1924,-0.0344);
    sampleSphere[8] = vec3(-0.3577,-0.5301,-0.4358);
    sampleSphere[9] = vec3(-0.3169, 0.1063, 0.0158);
    sampleSphere[10] = vec3( 0.0103,-0.5869, 0.0046);
    sampleSphere[11] = vec3(-0.0897,-0.4940, 0.3287);
    sampleSphere[12] = vec3( 0.7119,-0.0154,-0.0918);
    sampleSphere[13] = vec3(-0.0533, 0.0596,-0.5411);
    sampleSphere[14] = vec3( 0.0352,-0.0631, 0.5460);
    sampleSphere[15] = vec3(-0.4776, 0.2847,-0.0271);

    float radiusDepth = ssaoRadius/depth;
    float occlusion = 0.0;
    for(int i=0; i < samples; i++)
    {
        vec3 ray = radiusDepth * reflect(sampleSphere[i], random);
        vec3 hemiRay = position + sign(dot(ray, normal)) * ray;

        float occDepth = texture2D(texture0, clamp(hemiRay.xy, 0.0, 1.0)).r;
        float difference = depth - occDepth;

        occlusion += step(ssaoFalloff, difference) * (1.0 - smoothstep(ssaoFalloff, ssaoArea, difference));

        // float rangeCheck = abs(difference) < radiusDepth ? 1.0 : 0.0;
        // occlusion += (occDepth <= position.z ? 1.0 : 0.0) * rangeCheck;
    }

    float ao = 1.0 - ssaoStrength * occlusion * (1.0 / float(samples));

    gl_FragColor = vec4(clamp(ao + ssaoBase, 0.0, 1.0));
}

vec3 GetNormalFromDepth(float depth, vec2 uv)
{
    vec2 offset1 = vec2(0.0,1.0/agk_resolution.y);
    vec2 offset2 = vec2(1.0/agk_resolution.x,0.0);

    float depth1 = texture2D(texture0, uv + offset1).r;
    float depth2 = texture2D(texture0, uv + offset2).r;

    vec3 p1 = vec3(offset1, depth1 - depth);
    vec3 p2 = vec3(offset2, depth2 - depth);

    vec3 normal = cross(p1, p2);
    normal.z = -normal.z;

    return normalize(normal);
}

person Jan Bögemann    schedule 28.09.2017    source источник
comment
texture1 — это текстура шума, как описано в учебнике. agk_resolution — это размер цели рендеринга, а размер текстуры шума составляет 64*64 пикселя. На самом деле я не очень понимаю, почему они используют текстуру шума, потому что vec3 random = vec3(1.0) похожие результаты... мерцание все еще присутствует. Вы пробовали это в gsl версии 120? это то, что я использую. Но спасибо за тест   -  person Jan Bögemann    schedule 28.09.2017
comment
Нет, я не генерирую новый шум для каждого кадра. нужно ли мне ?? Я использую предварительно сгенерированную текстуру шума 64*64. И я использую размытие 4 * 4 или размытие по вертикали 13 и горизонтали 13. pastebin.com/4bLmthvj   -  person Jan Bögemann    schedule 29.09.2017
comment
ну, я уже попробовал текстуру шума 4 * 4 и равномерно распределил ее по целевому объекту рендеринга, но это не устранило мерцание. Я снова протестировал его с шумом 4 * 4 и размытием 4 * 4. Это не выглядит лучше и не решило мерцание. Спасибо   -  person Jan Bögemann    schedule 29.09.2017


Ответы (1)


Я тщательно проверил свой код и код, который вы (Rabbid76) создали для JSFiddle, и наткнулся на оператор if (depth > 0.0), который решил проблему... так что вы каким-то образом ответили на мой вопрос, и я хотел бы поблагодарить вас и отметить вас за что

person Jan Bögemann    schedule 28.09.2017