Как получить плавный результат с RSM (Reflective Shadow Mapping)? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь реализовать программу Reflective Shadow Mapping с Vulkan. Проблема в том, что результат получился плохим: rsm_error

Как видите, результат не является гладким.

Здесь я рендерину в первом проходе позицию, нормаль и поток изПоложение света в 3 текстурах с разрешением 512 * 512.

Во втором проходе я вычисляю непрямое освещение из текстур первого прохода согласно этой статье (http://www.klayge.org/material/3_12/GI/rsm.pdf):

for(int i = 0; i < 151; i++)
{
    vec4 rsmProjCoords = projCoords + vec4(rsmDiskSampling[i] * 0.09, 0.0, 0.0);

    vec3 indirectLightPos = texture(rsmPosition, rsmProjCoords.xy).rgb;
    vec3 indirectLightNorm = texture(rsmNormal, rsmProjCoords.xy).rgb;
    vec3 indirectLightFlux = texture(rsmFlux, rsmProjCoords.xy).rgb;

    vec3 r = worldPos - indirectLightPos;
    float distP2 = dot( r, r ); 

    vec3 emission = indirectLightFlux * (max(0.0, dot(indirectLightNorm, r)) * max(0.0, dot(N, -r)));
    emission *= rsmDiskSampling[i].x * rsmDiskSampling[i].x / (distP2 * distP2);        

    indirectRSM += emission;
}

1 Ответ

0 голосов
/ 22 октября 2019

Проблема исправлена.

Основной проблемой была выборка, я использовал линейную выборку вместо ближайшей выборки:

samplerInfo.magFilter = VK_FILTER_NEAREST;
samplerInfo.minFilter = VK_FILTER_NEAREST;

Другими проблемами было количество используемых VPLи расстояние между ними.

...