如何使用 RSM(Reflective Shadow Mapping)获得平滑的结果?
How to get a smooth result with RSM (Reflective Shadow Mapping)?
我正在尝试使用 Vulkan 实施反射阴影贴图程序。
问题是结果不好:
如您所见,结果并不平滑。
这里我在第一遍中渲染 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;
}
问题已解决。
主要问题是采样,我使用的是线性采样而不是最近采样:
samplerInfo.magFilter = VK_FILTER_NEAREST;
samplerInfo.minFilter = VK_FILTER_NEAREST;
其他问题是使用的 VPL 数量和它们之间的距离。
我正在尝试使用 Vulkan 实施反射阴影贴图程序。
问题是结果不好:
如您所见,结果并不平滑。
这里我在第一遍中渲染 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;
}
问题已解决。
主要问题是采样,我使用的是线性采样而不是最近采样:
samplerInfo.magFilter = VK_FILTER_NEAREST;
samplerInfo.minFilter = VK_FILTER_NEAREST;
其他问题是使用的 VPL 数量和它们之间的距离。