SSR 在相机移动时扭曲

问题描述 投票:0回答:0

一直致力于实现一些简单的屏幕空间反射,我觉得我的算法是正确的,但我似乎无法弄清楚为什么当相机四处移动时反射会失真。我使用

CameraPos
来计算
camDir
,这是我认为问题可能出现的地方但是我也尝试使用硬编码值,例如
float4(0.0, 5.0, -0.7)
结果与当相机在场景中移动时相同,反射变得扭曲。在某些特定的地方,根据相机的位置,反射看起来是正确的。我想知道是否有人遇到过类似的事情并且可以提供一些关于我可能做错了什么的见解。提前致谢。

// World space normal and positions
float3 normal = normalize(gNormal.Sample(sampleState, input.texCoord).xyz);
float4 WorldPos = float4(gPosition.SampleLevel(sampleState, input.texCoord, 0).xyz, 1.0);
float4 camDir = WorldPos - CameraPos;
float3 refDir = normalize(reflect(normalize(camDir.xyz), normal));

float noise(float2 seed)
{
    return frac(sin(dot(seed.xy, float2(12.9898, 78.233))) * 43758.5453);
}

// Calculating the reflection
float4 RayTrace(float3 reflectionWorld, const int maxCount, float stepSize, float3 pos, float2 uv)
{
    float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
    float3 step = stepSize * reflectionWorld;
    float4x4 projView = mul(V, P);
  
    for (int i = 1; i <= maxCount; i++)
    {
        float3 ray = (i + noise(uv + Time)) * step;
        float3 rayPos = pos + ray;
        float4 vpPos = mul(float4(rayPos, 1.0f), projView);
        float2 rayUv = vpPos.xy / vpPos.w * float2(0.5f, -0.5f) + float2(0.5f, 0.5f);

        float rayDepth = vpPos.z / vpPos.w;
        float gbufferDepth = gDepthBuffer.SampleLevel(sampleState, rayUv, 0).r;
        if (rayDepth - gbufferDepth > 0 && rayDepth - gbufferDepth < MaxThickness)
        {
            float a = 0.3f * pow(min(1.0, (stepSize * maxCount / 2) / length(ray)), 2.0);
            color = color * (1.0f - a) + float4(gDiffuse.SampleLevel(sampleState, rayUv, 0).rgb, 1.0) * a;
            break;
        }
    }

    return color;
}
graphics directx hlsl post-processing
© www.soinside.com 2019 - 2024. All rights reserved.