重建深度时检测像素位置何时没有几何体

Detecting when there is no geometry at a pixel location when reconstructing depth

我正在从深度纹理重建片段位置以高效地执行光照计算。

问题在于,在没有几何体的区域(例如下图中的地板、天花板和 window),由于光照计算,片段输出颜色为黑色。我需要这些区域是白色的,这样才能看到天空盒。

如果像素片段在该位置没有原始几何体,我如何从着色器中检测到?

void main(void)
{
    // Calculate texture co-ordinate
    vec2 gScreenSize = vec2(screenWidth, screenHeight);
    vec2 TexCoord = gl_FragCoord.xy / gScreenSize;

    // Get the Fragment Z position (from the depth buffer)
    float z = texture(MyTexture2, vec2(TexCoord.s, TexCoord.t)).x * 2.0f - 1.0f;
    vec4 clipSpacePosition = vec4(vec2(TexCoord.s, TexCoord.t) * 2.0 - 1.0, z, 1.0);
    vec4 viewSpacePosition = inverseProjectionMatrix * clipSpacePosition;

    // Get the Fragment XYZ position (perspective division, via it's depth value)
    viewSpacePosition /= viewSpacePosition.w;
    vec4 worldSpacePosition = inverseViewMatrix * viewSpacePosition;
    vec3 fragPosition = worldSpacePosition.xyz;

    // Lighting calulations
    ......
}

毫无疑问,这个问题有很多解决方案,我想到了这个。

Skybox pass:将天空盒渲染到Albedo纹理中,将黑色渲染到Normal纹理中。

Geometry pass:在天空盒(反照率和法线)上渲染剩余的场景数据

Lighting pass:计算光照,如果片段法线是黑色,则输出白色。

复合过程:将反照率纹理与光照纹理相乘。