Screen space reflections неправильные отражения

Пытаюсь реализовать screen space reflections. После долгих попыток получил такой результат:

https://youtu.be/yzkgpcliBVQ

Как видно, отражения обрезаются, если подойти ближе и растягиваются, если отойти дальше. Все векторы, вроде как, переведены в одно координатное пространство, функция трансформации между пространствами правильная.


void main()
{
    vec4 texelNormalWS = getNormal(TexCoords);

    vec4 texelNormalVS = inverse(transpose(view)) * texelNormalWS;
    vec4 texelPositionWS = getPosition(TexCoords);

    vec3 viewDirVS = (view * texelPositionWS).xyz;
    vec3 reflectDirVS = normalize(reflect(normalize(viewDirVS.xyz),normalize(texelNormalVS.xyz)));

    ...

    color = vec4(ssrVS(viewDirVS, reflectDirVS),1.0f);
}

vec2 viewSpaceToSS(vec3 position)
{
     vec4 pVP = proj * vec4(position,1.0f);
     pVP.xy /=pVP.w;
     pVP.xy = pVP.xy * 0.5f + 0.5f;
     return pVP.xy;
}

vec2 BinarySearchVS(vec3 ray, vec3 dir)
{
    vec2 projectedCoords;
    float depth;

    for(int i = 0; i < 5; i++)
    {
        projectedCoords = viewSpaceToSS(ray);
        depth = getPosition(projectedCoords).z;

        float dDepth = ray.z - depth;

        dir *= 0.5f;
        if(dDepth > 0.0f)
            ray += dir;
        else
            ray -= dir;    
    }

    ray.z-=depth;
    return viewSpaceToSS(ray);
}

vec3 ssrVS(vec3 ray, vec3 dir)
{
    float stepSize = 0.2f;
    const int maxSteps = 100;
    vec2 projectedCoords;

    dir*=stepSize;

    for(int i = 0; i < maxSteps; i++)
    {
        ray+=dir;

        projectedCoords = viewSpaceToSS(ray);
        float depth = getPosition(projectedCoords).z;

        if (depth > 100.0f)
            continue;
        
        float dDepth = ray.z - depth;
        if(dDepth <= 0 && dir.z - dDepth < 1.2)
            projectedCoords = BinarySearchVS(ray,dir);
    }   

    return getColor(projectedCoords).xyz;
}

Есть у кого-то предположение что не так?


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