重建深度时检测像素位置何时没有几何体
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:计算光照,如果片段法线是黑色,则输出白色。
复合过程:将反照率纹理与光照纹理相乘。
我正在从深度纹理重建片段位置以高效地执行光照计算。
问题在于,在没有几何体的区域(例如下图中的地板、天花板和 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:计算光照,如果片段法线是黑色,则输出白色。
复合过程:将反照率纹理与光照纹理相乘。